GoSuda

Vloženie premenných v čase kompilácie v Go: využitie go build -ldflags -X

By wHoIsDReAmer views ...

Pozadie

Pri práci na firemnom projekte som hľadal spôsob, ako vložiť premenné v čase kompilácie bez použitia .env súboru. Myslel som si, že ak by to fungovalo, bolo by to veľmi pohodlné, pretože by stačil jediný súbor bez .env alebo viacerých konfiguračných súborov.

Najprv som hľadal nástroj typu go:generate CLI, ktorý by na základe .env generoval súbor s konštantami, ale žiadny som nenašiel.

Keďže však v takom prípade by stačilo jednoducho upraviť constants a nebolo potrebné zbytočne spúšťať generovanie, hľadal som ďalej a našiel som spôsob, ktorý umožňuje vkladať hodnoty v čase kompilácie, podobne ako makro include_bytes! v Ruste.

Vkladanie premenných v čase kompilácie

Použitie je jednoduché.

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

Ak existuje kód vyššie, pri zostavení je možné hodnotu vložiť nasledovne.

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

Ak odovzdáme argument prostredníctvom ldflag, hodnota bar sa počas zostavovania, teda v čase kompilácie, vloží do premennej Foo. Je to jednoduché.

Ak sa v projekte nachádzajú balíky alebo premenné s rovnakým názvom na viacerých miestach, stačí uviesť cestu k balíku.

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

V takom prípade je možné hodnoty rozlíšiť a vložiť nasledovne:

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

Ak sa viacero premenných nachádza v rovnakom balíku, stačí odovzdať ďalšie argumenty rovnakým spôsobom.

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

Vlastnosti sú nasledovné:

  • Premenná nemusí byť public: vložiť možno aj premennú, ktorá začína malým písmenom
  • Podporovaný je iba typ string: iné typy nie sú podporované

Referencie