Injectarea Variabilelor la Compile-Time în Go
Context
În cursul unui proiect de companie, am căutat o metodă de a injecta variabile la momentul compilării fără a utiliza fișiere .env.
Am considerat că acest lucru ar fi extrem de convenabil, deoarece ar necesita un singur fișier în loc de .env sau multiple fișiere de configurare.
Inițial, am căutat un CLI go:generate care să genereze un fișier constant bazat pe .env, dar nu am găsit așa ceva.
Cu toate acestea, dacă ar fi fost cazul, ar fi fost mai simplu să modific direct constantele, în loc să parcurg procesul laborios de generare, așa că am căutat o metodă similară cu macro-ul include_bytes! din Rust pentru a injecta valori la momentul compilării.
Inserarea variabilelor la momentul compilării
Utilizarea este simplă.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Dacă avem codul de mai sus, putem injecta variabilele la momentul construirii, după cum urmează:
1go build -ldflags="-X 'main.Foo=bar'"
Prin transmiterea argumentelor prin ldflag, valoarea bar este injectată în variabila Foo la momentul compilării, în timpul construirii. Este simplu.
Dacă există pachete sau variabile cu același nume în mai multe locații din proiect, se poate specifica calea pachetului.
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
În acest caz, se pot injecta variabilele în mod distinct, după cum urmează:
1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
Chiar dacă există mai multe variabile în același pachet, este suficient să se transmită argumente suplimentare.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Caracteristicile sunt următoarele:
- Variabilele nu trebuie să fie publice: Variabilele care încep cu o literă mică pot fi, de asemenea, injectate.
- Suportă doar tipul string: Nu sunt suportate alte tipuri.