GoSuda

Go fordítási idejű változó-injektálás: go build -ldflags -X használata

By wHoIsDReAmer views ...

Háttér

A közelmúltbeli céges projektmunka során azt kerestem, hogy van-e mód arra, hogy .env fájl nélkül, fordítási időben injektáljak változókat. Úgy gondoltam, hogy ha ez lehetséges, az rendkívül kényelmes lenne, hiszen így a .env fájlok és a különböző konfigurációs fájlok helyett elegendő egyetlen fájl.

Először azt néztem meg, van-e olyan go:generate CLI eszköz, amely a .env alapján konstansfájlt generál, de ilyet nem találtam.

Ha már úgyis így van, akkor egyszerűbb egyszerűen módosítani a constants fájlt, nem kell körülményesen generálni, így a Rustban található include_bytes! makróhoz hasonló módon, fordítási időben értékeket injektáló megoldást kerestem.

Fordítási idejű változó injektálás

A használata egyszerű.

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

Ha a fenti kód adott, akkor build időben a következő módon lehet injektálni.

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

Az ldflag segítségével átadott argumentum révén fordítási időben a Foo változó értéke bar lesz. Ez egyszerű.

Ha a projektben több helyen is van azonos nevű csomag vagy változó, akkor meg kell adni a csomag elérési útját.

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

Ilyen esetben a következő módon lehet megkülönböztetve injektálni:

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

Ugyanazon csomagon belül található több változó esetén is elegendő további argumentumokat átadni.

1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"

Jellemzői a következők:

  • A változó nem kell, hogy exportált legyen: kisbetűvel kezdődő változó is injektálható
  • Csak string típust támogat: más típusokat nem támogat

Hivatkozás