GoSuda

Compile-Time Variable Injection de Go

By wHoIsDReAmer
views ...

Antecedentes

Ao trabalhar em um projeto da empresa recentemente, procurei se existia um método para injetar variáveis em compile time sem usar .env. Pensei que isso seria extremamente conveniente, pois bastaria um único arquivo, sem a necessidade de .env ou múltiplos arquivos de configuração.

Inicialmente, procurei algo como um CLI go:generate que gerasse arquivos de constants com base em .env, mas não encontrei.

No entanto, se fosse esse o caso, seria mais simples modificar os constants diretamente, sem a necessidade de um processo de gen complicado; em vez disso, encontrei um método para injetar valores em compile time, semelhante ao macro include_bytes! em Rust.

Injeção de Variáveis em Compile Time

O uso é simples.

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

Assumindo que há um código como o acima, é possível injetar variáveis durante o build da seguinte forma:

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

Ao passar argumentos via ldflag, o valor bar é injetado na variável Foo em compile time durante o build. É simples.

Se houver múltiplos packages ou variáveis com o mesmo nome no projeto, basta especificar o package path.

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 variáveis de forma diferenciada, como segue:

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

Mesmo quando há múltiplas variáveis no mesmo package, 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 public: Variáveis que começam com letra minúscula também podem ser injetadas.
  • Apenas string type é suportado: Outros types não são suportados.

Referência