Go-kääntöajan muuttujien injektointi: go build -ldflags -X -käytön opas

Tausta
Työskennellessäni äskettäin yrityksen projektin parissa etsin tapaa injektoida muuttujia käännösajassa ilman .env-tiedostoa.
Ajattelin, että tämä olisi erittäin kätevää, koska silloin riittäisi yksi ainoa tiedosto ilman .env-tiedostoja tai useita konfiguraatiotiedostoja.
Aluksi etsin go:generate-CLI-työkalua, joka generoisi vakiotiedoston .env-tiedoston pohjalta, mutta sellaista ei löytynyt.
Toisaalta, jos asia on näin, voisi yksinkertaisesti muokata constants-tiedostoa eikä tarvitsisi vaivautua generoinnilla. Löysin kuitenkin Rustin include_bytes!-makron kaltaisen tavan injektoida arvoja käännösajassa.
Käännösajan muuttujien injektointi
Käyttö on yksinkertaista.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Jos koodi on yllä olevan kaltainen, voidaan arvo injektoida buildin yhteydessä seuraavasti.
1go build -ldflags="-X 'main.Foo=bar'"
Kun argumentti välitetään ldflag-lipun kautta, muuttujan Foo arvoksi injektoituu käännösajassa arvo bar. Se on yksinkertaista.
Jos projektissa on useita samannimisiä paketteja tai muuttujia eri paikoissa, riittää määrittää paketin polku.
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
Tällaisissa tapauksissa voidaan injektoida erikseen seuraavasti:
1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
Myös samassa paketissa olevien useiden muuttujien kohdalla riittää, että välitetään lisää argumentteja.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Ominaisuudet ovat seuraavat:
- Muuttujan ei tarvitse olla julkinen: myös pienellä kirjaimella alkavan muuttujan arvo voidaan injektoida.
- Tuetaan vain string-tyyppi: muita tyyppejä ei tueta.