Iniezione di Variabili in Compile-Time in Go
배경
Mentre lavoravo a un progetto aziendale, ho cercato se esistesse un modo per iniettare variabili al momento della compilazione senza l'uso di .env
.
Ho pensato che sarebbe stato estremamente conveniente, poiché in questo modo sarebbe stato necessario un solo file anziché un .env
o numerosi file di configurazione.
Inizialmente, ho cercato un'interfaccia CLI go:generate
che generasse file costanti basati su .env
, ma non ne ho trovata alcuna.
Tuttavia, se fosse stato così, sarebbe stato sufficiente modificare le costanti, e non sarebbe stato necessario ricorrere alla generazione in modo così macchinoso; ho invece trovato un metodo per iniettare valori al momento della compilazione, simile alla macro include_bytes!
in Rust.
Iniezione di Variabili al Momento della Compilazione
L'utilizzo è semplice.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Supponendo che esista un codice come quello sopra, è possibile iniettare valori durante la build come segue:
1go build -ldflags="-X 'main.Foo=bar'"
Passando argomenti tramite ldflag
, il valore bar
viene iniettato nella variabile Foo
al momento della compilazione durante la build. È semplice.
Se nel progetto esistono 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 tali casi, è possibile distinguere e iniettare 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 nel caso in cui ci siano più variabili nello stesso pacchetto, è 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
public
: È possibile iniettare anche variabili che iniziano con una lettera minuscola. - Supporta solo il tipo
string
: Altri tipi non sono supportati.