di Go Compile-Time Variable Injection
Sfondo
Durante il lavoro sul progetto aziendale questa volta, ho cercato se esistesse un modo per iniettare variabili in fase di compilazione senza l'uso di .env. Ho pensato che sarebbe stato estremamente conveniente, poiché ciò richiederebbe solo un singolo file senza la necessità di .env o di diversi file di configurazione.
Inizialmente, ho cercato qualcosa come una go:generate
CLI che generasse file di constants
basati su .env, ma non l'ho trovata.
Tuttavia, se fosse così, basterebbe modificare i constants
senza la necessità di un processo gen
ingombrante, e ho trovato un modo per iniettare valori in fase di compilazione, simile alla macro include_bytes!
in 러스트.
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 ha un codice come quello sopra, si può iniettare in fase di build come segue.
1go build -ldflags="-X 'main.Foo=bar'"
Passando argomenti tramite ldflag, il valore bar
viene iniettato nella variabile Foo
in fase di compilazione durante la fase di build. È semplice.
Se ci sono più pacchetti o variabili con lo stesso nome in diverse posizioni nel progetto, è 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, si può iniettare distinguendo 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 ci sono 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: Non supporta altri tipi.