GoSuda

Compile-Time Variable Injection in Go

By wHoIsDReAmer
views ...

Contesto

Durante un recente progetto aziendale, ho cercato un metodo per iniettare variabili in fase di compilazione senza l'uso di file .env. Ho ritenuto che ciò sarebbe stato estremamente conveniente, poiché avrebbe richiesto un solo file invece di un .env o di molteplici file di configurazione.

Inizialmente, ho cercato uno strumento CLI come go:generate che potesse creare un file di costanti basato su un .env, ma non ne ho trovato alcuno.

Tuttavia, in tal caso, sarebbe stato più semplice modificare direttamente le costanti piuttosto che ricorrere a una generazione complicata, e ho scoperto un metodo per iniettare valori in fase di compilazione, simile alla macro include_bytes! in Rust.

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}

Se si dispone del codice sopra riportato, è possibile iniettare le variabili durante la build come segue:

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

Passando gli argomenti tramite ldflag, il valore bar viene iniettato nella variabile Foo in fase di compilazione durante la build. È semplice.

Se nel progetto sono presenti più pacchetti o variabili con lo stesso nome, è 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, l'iniezione può essere differenziata 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 se un singolo pacchetto contiene più variabili, è sufficiente 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:

  • La variabile non deve essere pubblica: è possibile iniettare anche variabili che iniziano con una lettera minuscola.
  • Supporta solo il tipo string: altri tipi non sono supportati.

Riferimenti