GoSuda

Go'n Compile-Time Variable Injection

By wHoIsDReAmer
views ...

Tausta

Tällä kertaa etsin työskennellessäni yritysprojektin parissa, olisiko olemassa tapa syöttää muuttujia käännösaikana ilman .env-tiedostoa. Ajattelin, että tämä olisi erittäin kätevää, koska silloin tarvitsisi vain yhden tiedoston ilman .env- tai useita konfiguraatiotiedostoja.

Aluksi etsin go:generate CLI:n kaltaista työkalua, joka generoisi vakiotiedoston .env-tiedoston perusteella, mutta sellaista ei ollut.

Toisaalta, jos näin olisi, voisi vain muokata constants-tiedostoa, eikä olisi tarvetta vaivautua gen-toimintoon, ja löysin tavan syöttää arvoja käännösaikana, kuten Rustin include_bytes! macro.

Muuttujan syöttäminen käännösaikana

Käyttö on yksinkertaista.

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

Jos on yllä kaltainen koodi, sen voi syöttää käännösvaiheessa seuraavasti.

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

Kun ldflag-argumentit välitetään, bar-arvo syötetään Foo-muuttujaan käännösaikana käännösvaiheessa. Se on yksinkertaista.

Jos samannimisiä paketteja tai muuttujia on useita projektissa, riittää, että määritetään 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ässä tapauksessa voi syöttää erottelemalla seuraavasti:

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

Jos samassa paketissa on useita muuttujia, voi vain välittää 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 public: Pienellä alkavan muuttujan voi myös syöttää.
  • Vain string-tyyppi tuettu: Muita tyyppejä ei tueta.

Viitteet