GoSuda

Iniezione di Variabili in Compile-Time in Go

By wHoIsDReAmer
views ...

배경

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.

Riferimenti