GoSuda

Injeção de Variáveis em Compile-Time no Go

By wHoIsDReAmer
views ...

Contexto

Durante o trabalho em um projeto da empresa, procurei um método para injetar variáveis em tempo de compilação sem depender de um arquivo .env. Pensei que isso seria extremamente conveniente, pois exigiria apenas um único arquivo, eliminando a necessidade de um .env ou múltiplos arquivos de configuração.

Inicialmente, procurei por uma CLI go:generate que pudesse gerar arquivos de constantes a partir de um .env, mas não encontrei nenhuma.

No entanto, se esse fosse o caso, seria mais simples modificar as constantes diretamente, em vez de gerar arquivos de forma complicada; então, procurei um método para injetar valores em tempo de compilação, semelhante à macro include_bytes! em 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}

Assumindo o código acima, ele pode ser injetado durante a compilação da seguinte forma:

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

Ao passar argumentos com ldflag, o valor bar é injetado na variável Foo em tempo de compilação durante o processo de build. É simples.

Se houver múltiplos pacotes ou variáveis com o mesmo nome no projeto, o caminho do pacote deve ser especificado.

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, a injeção pode ser diferenciada 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: Variáveis que começam com letras minúsculas também podem ser injetadas.
  • Suporta apenas o tipo string: Outros tipos não são suportados.

Referência