GoSuda

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

By wHoIsDReAmer views ...

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.

Viitteet