GoSuda

Go:s Compile-Time Variable Injection

By wHoIsDReAmer
views ...

Bakgrund

Under arbetet med ett företagsprojekt nyligen undersökte jag om det fanns ett sätt att injicera variabler vid kompileringstid utan att använda .env-filer. Jag tänkte att detta skulle vara mycket bekvämt eftersom det skulle eliminera behovet av .env eller flera konfigurationsfiler, och endast en enda fil skulle krävas.

Till att börja med sökte jag efter ett go:generate CLI som kunde generera en konstantfil baserad på .env, men jag hittade inget sådant.

Men om det var fallet, skulle det inte vara nödvändigt att krångla med att generera filer; man skulle bara kunna modifiera konstanterna direkt, och jag fann ett sätt att injicera värden vid kompileringstid, liknande Rusts include_bytes! makro.

Injektion av variabler vid kompileringstid

Användningen är enkel.

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

Om det finns kod som den ovan kan den injiceras under byggprocessen på följande sätt:

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

Genom att skicka argument via ldflag injiceras värdet bar i variabeln Foo vid kompileringstid under byggprocessen. Det är enkelt.

Om det finns flera paket eller variabler med samma namn i projektet, måste paketets sökväg specificeras.

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

I sådana fall kan injektionen differentieras på följande sätt:

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

Om det finns flera variabler i samma paket, behöver man bara skicka ytterligare argument.

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

Egenskaperna är följande:

  • Variabeln behöver inte vara publik: Variabler som börjar med små bokstäver kan också injiceras.
  • Stöder endast strängtyp: Andra typer stöds inte.

Referenser