Meu nome é Elton Minetto

Golang: usando build tags para armazenar configurações

Um dos 12 fatores, conjunto de boas práticas muito usado em projetos modernos, é:

Armazene as configurações no ambiente

Realmente atender a esta prática deixa torna o projeto muito mais maleável, mas um dos requisitos para isso é que você tenha o controle do ambiente onde a sua aplicação vai executar. Isso é verdadeiro quando pensamos em fazer o deploy de uma aplicação web, api ou micro serviço. Mas e quando o nosso aplicativo precisa executar na máquina de um usuário final, onde não temos o controle do ambiente? Passei por esta situação recentemente, ao desenvolver um aplicativo CLI para ser usado pelos usuários da Code:Nation.

Como estamos usando Go como principal linguagem de programação a solução escolhida foi o uso das build tags, que são condições passadas para o compilador e que são usadas no momento da geração do binário do projeto.

Para isso, criamos um pacote chamado config onde armazenamos as configurações do projeto, separadas pelos ambientes onde ele vai executar:

config_tree.png

Dentro de cada arquivo criamos constantes com as configurações necessárias:

config_dev.png

O detalhe importante é a primeira linha do arquivo, onde consta:

// +build dev

Esta é a build tag que vamos usar no momento da compilação:

go build -tags dev -o ./bin/api api/main.go
go build -tags dev -o ./bin/search cmd/main.go

Desta forma o compilador vai ignorar os outros arquivos, que possuem uma tag diferente da indicada. Os arquivos que não possuem tags são processados normalmente durante a compilação, então não é preciso alterar mais nada no projeto.

Para fazer uso das configurações basta importar o pacote normalmente, como no exemplo:

config_main.png

Usando build tags, junto com ferramentas de automação como make e o excelente GoReleaser podemos facilitar muito o processo de build e deploy de aplicativos escritos em Go.

Se você quiser ler mais sobre as build tags uma boa dica é a documentação oficial. E se quiser ver o exemplo completo que mostrei neste post o código está no Github.