GoSuda

Iniezione di variabili in fase di compilazione in Go: uso di go build -ldflags -X

By wHoIsDReAmer views ...

Contesto

In questo periodo, lavorando a un progetto aziendale, ho cercato un modo per iniettare variabili in fase di compilazione senza usare un file .env. Ritenevo che, eliminando .env e i vari file di configurazione, bastasse un unico file, cosa che sarebbe stata molto comoda.

Inizialmente ho cercato un CLI basato su go:generate in grado di generare un file di costanti a partire da .env, ma non ne ho trovati.

Tuttavia, se fosse così, sarebbe bastato modificare direttamente le constants senza dover eseguire anche la generazione, e ho quindi trovato qualcosa come la macro include_bytes! di Rust, che permette di iniettare valori in fase di compilazione.

Iniezione di variabili in fase di compilazione

L'utilizzo è semplice.

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

Dato un codice come quello sopra, è possibile iniettare il valore in fase di build nel seguente modo.

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

Passando l'argomento tramite ldflag, il valore bar viene iniettato nella variabile Foo in fase di compilazione. È semplice.

Se nel progetto esistono pacchetti o variabili con lo stesso nome in più punti, è sufficiente specificare il percorso del pacchetto.

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

In questi casi è possibile distinguerli e iniettarli come segue:

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

Anche quando più variabili appartengono allo stesso pacchetto, basta passare argomenti aggiuntivi.

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

Le caratteristiche sono le seguenti:

  • Non è necessario che la variabile sia pubblica: è possibile iniettare anche variabili il cui nome inizia con una lettera minuscola
  • Supporta solo il tipo string: altri tipi non sono supportati

Riferimenti