make
é uma ferramenta de sistemas Unix utilizada para buildar programas desde 1976.
Embora seja muito utilizada em, e frequentemente associada a, desenvolvimento de programas em C ou C++, o make
também foi a ferramenta adotada pela comunidade Go para automatizar tarefas relacionadas a projetos.
Para utilizar o make
precisamos de um arquivo, que por convenção é chamado de Makefile, que contem as instruções de como buildar um determinado projeto.
Abaixo segue exemplo de um Makefile qualquer para um programa em Go:
# variaveis
GOCMD = go
GOLINT = golint
# declaracao da instrucao default
.DEFAULT_GOAL := build
# rules
fmt:
$(GOCMD) fmt ./...
.PHONY: fmt
lint: fmt
$(GOLINT) ./...
.PHONY: lint
vet: fmt
$(GOCMD) vet ./...
.PHONY: vet
build: vet
$(GOCMD) build
.PHONY:build
Passando por cada aspecto rapidamente:
Nas primeiras linhas do arquivo vemos a declaração de algumas variáveis que serão uteis para nos ajudar a chamar o comando nas regras definidas (rules). A variável GOCMD é especialmente interessante pois podemos deixar nosso Makefile agnóstico de versões do Go, uma vez que, com o suporte built-in da linguagem, deverias ter algo como go1.15.2 quando quisermos utilizar uma versão específica.
Na linha seguinte temos a declaração do .DEFAULT_GOAL que atribui qual vai ser a regra a ser rodada quando não passarmos nenhum argumento pro executável do make
, ou seja, invocando somente make
no diretório do projeto vai executar a regra “build”.
Nas próximas linhas temos as declarações de regras (rules), essas regras são os nomes que damos a sequencias de instruções shell que deverão ser executadas, alem disso, temos a declaração do .PHONY, uma instrução que dita que aquela regra em específico não produz um arquivo como output.
A estrutura de uma regra é a seguinte:
nome_da_regra: dep1 dep2
intructions
instruction2
dep1: ...
Um importante aspecto que precisamos nos atentar é que o make
é bem “chato” quando se trata de espaçamento antes das instruções shell, precisamos sempre usar tab ante de cada instrução, não podemos usar espaços (como usamos por padrão em alguns editores de texto, é bom verificar).
OBS sobre o Makefile de exemplo
Em projetos de produção você vai querer utilizar o golangci-lint, linter que faz o uso de diversos linter por debaixo dos panos, de maneira otimizada.
Utilizamos linters e formatters de maneira separada em cada rule para poder exemplificar como ficaria um Makefile um pouco mais complexo.
tl;dr
Em resumo, o uso do Makefile para projetos em Go representa uma abordagem eficaz e padronizada para automatizar tarefas relacionadas ao desenvolvimento, proporcionando uma estrutura organizada para execução de comandos essenciais. A flexibilidade oferecida pelo Makefile permite que desenvolvedores configurem regras específicas, como formatação, linting e compilação, de forma concisa e fácil de manter.
Top comments (1)
Sempre tive essas dúvidas, obrigado por compartilhar!