just vs make: Command Runner vs Build System
O just é um command runner focado em salvar e executar tarefas de projeto; o make é um build system cuja funcionalidade central é reconstruir arquivos com base em dependências.
Eles parecem semelhantes (um arquivo de receitas nomeadas), mas resolvem problemas diferentes. O make rastreia timestamps de arquivos para reconstruir apenas o que mudou; o just deliberadamente abre mão disso e foca em uma execução de tarefas ergonômica e multiplataforma.
| just | make | |
|---|---|---|
| Propósito principal | Rodar comandos nomeados do projeto | Construir arquivos a partir de dependências |
| Rastreamento de dependências de arquivos | Não (por design) | Sim (baseado em timestamp) |
| Armadilhas de sintaxe | Tolerante, erros claros | Tabs, .PHONY, peculiaridades de shell |
| Argumentos para receitas | De primeira classe | Desajeitado |
| Multiplataforma | Consistente | Varia por make/shell |
Onde o just vence
Para "rodar as tarefas do meu projeto" (lint, test, build, deploy) o just é mais agradável: as receitas recebem argumentos de forma limpa, os erros são claros, não há armadilha de tab-versus-espaço nem comportamento incremental acidental, e ele se comporta de forma consistente entre plataformas. Ele foi feito de propósito como um command runner.
Onde o make vence
Quando você realmente precisa de builds incrementais (compilar apenas os fontes que mudaram, regenerar saídas quando as entradas mudam), o grafo de dependências baseado em timestamp do make é justamente o ponto, e o just não o substitui. O make também está instalado em quase todo lugar, então não precisa de provisionamento extra.
Em CI
Se suas etapas de "build" são na verdade aliases de tarefas, o just deixa os pipelines mais limpos; se você depende de rebuilds incrementais, mantenha o make (ou um build system de verdade). Provisionar o just adiciona uma etapa de instalação; o make normalmente já está presente.
O veredito
Use o just quando quiser um command runner ergonômico para tarefas de projeto; use o make quando precisar de builds incrementais reais baseados em arquivos ou de ubiquidade sem instalação. Eles não são substitutos diretos.