GoSuda

Go fordítási idejű változóinjekciója

By wHoIsDReAmer
views ...

Háttér

Ez alkalommal, egy céges projektmunkán dolgozva, utána néztem, hogy létezik-e módszer a változók fordítási időben történő injektálására .env fájl nélkül. Azt gondoltam, hogy ez rendkívül kényelmes lenne, mivel így nincs szükség .env vagy több konfigurációs fájlra, csupán egyetlen fájlra.

Először olyan go:generate CLI-t kerestem, amely .env alapján hoz létre konstans fájlokat, de nem találtam ilyet.

Viszont, ha ez a helyzet, akkor egyszerűen módosíthatjuk a constants fájlt, és nincs szükség bonyolult generálásra, ehelyett olyan módszert kerestem, amely a Rust include_bytes! makrójához hasonlóan képes értékeket injektálni fordítási időben.

Változó injektálás fordítási időben

A használata egyszerű.

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

Ha van egy ilyen kód, akkor fordításkor az alábbiak szerint injektálható:

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

Ha az ldflag-nek paramétereket adunk át, akkor a bar érték a Foo változóba injektálódik fordítási időben. Egyszerű.

Amennyiben a projektben azonos nevű package vagy változó több helyen is előfordul, meg kell adni a package 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 esetekben a következőképpen lehet megkülönböztetni és injektálni:

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

Ha ugyanabban a package-ben több változó is található, egyszerűen további argumentumokat kell átadni.

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

A jellemzők a következők:

  • Nem szükséges, hogy a változó public legyen: Kisbetűvel kezdődő változók is injektálhatók.
  • Csak string típus támogatott: Más típusok nem támogatottak.

Hivatkozások