GoSuda

Injeção de variáveis em tempo de compilação no Go: uso de go build -ldflags -X

By wHoIsDReAmer views ...

Contexto

Ao trabalhar em um projeto da empresa, procurei uma forma de injetar variáveis em tempo de compilação sem usar .env. Achei que, dessa forma, bastaria um único arquivo, sem .env nem vários arquivos de configuração, o que seria bastante conveniente.

Inicialmente, procurei uma CLI do tipo go:generate que gerasse um arquivo de constantes a partir de um .env, mas não encontrei nenhuma.

Porém, se fosse para isso, bastaria simplesmente modificar as constants, não havendo necessidade de se incomodar com a geração; foi então que encontrei um método de injetar valores em tempo de compilação, semelhante à macro include_bytes! do Rust.

Injeção de variáveis em tempo de compilação

O uso é simples.

1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8    fmt.Println(Foo)
9}

Dado um código como o acima, é possível injetar o valor durante o build da seguinte forma.

1go build -ldflags="-X 'main.Foo=bar'"

Ao passar o argumento pela ldflag, o valor bar é injetado na variável Foo em tempo de compilação. É simples.

Se houver pacotes ou variáveis com o mesmo nome em vários lugares do projeto, basta especificar o caminho do pacote.

1// github.com/myproject/config/config.go
2package config
3
4var Version string
5
6// github.com/myproject/internal/config/config.go
7package config
8
9var BuildTime string

Nesses casos, é possível injetar os valores diferenciando-os da seguinte forma:

1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"

Mesmo que haja várias variáveis no mesmo pacote, basta passar argumentos adicionais.

1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"

As características são as seguintes:

  • A variável não precisa ser pública: também é possível injetar valores em variáveis cujo nome começa com letra minúscula.
  • Suporta apenas o tipo string: outros tipos não são suportados.

Referências