GoSuda

Injectarea variabilelor la timpul compilării în Go: utilizarea go build -ldflags -X

By wHoIsDReAmer views ...

Context

Recent, în timpul lucrului la un proiect al companiei, am căutat o metodă de a injecta variabile în timpul compilării fără a folosi .env. Consideram că, dacă ar fi posibil, ar fi foarte convenabil, deoarece ar fi suficient un singur fișier, fără .env sau mai multe fișiere de configurare.

Inițial, am căutat un CLI de tip go:generate care să genereze un fișier de constante pe baza unui .env, însă nu am găsit unul.

Totuși, dacă e să fac asta, de ce nu aș modifica direct constantele, fără a mai trece prin pasul suplimentar de generare? Atunci am descoperit, în Rust, macroul include_bytes! și alte modalități de a injecta valori în timpul compilării.

Injectarea variabilelor în timpul compilării

Modul de utilizare este simplu.

1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8    fmt.Println(Foo)
9}

Pentru codul de mai sus, la build se poate injecta valoarea astfel:

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

Prin transmiterea argumentului prin ldflag, valoarea bar este injectată în variabila Foo în timpul compilării. Este simplu.

Dacă în proiect există pachete sau variabile cu același nume în mai multe locuri, este suficient să se specifice 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, injectarea se poate face diferențiat, astfel:

1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"

Dacă în același pachet există mai multe variabile, 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:

  • Variabila nu trebuie să fie publică: se poate injecta și o variabilă al cărei nume începe cu literă mică
  • Suportă doar tipul string: celelalte tipuri nu sunt suportate

Referințe