Go'n Compile-Time Variable Injection
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.