Go fordítási idejű változóinjekciója
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.