Go:n Compile-Time Variable Injection
Tausta
Työskennellessäni yritysprojektin parissa etsin tapaa injektoida 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 muita konfiguraatiotiedostoja.
Aluksi etsin go:generate CLI:n kaltaista työkalua, joka generoi vakiotiedostoja .env-tiedoston pohjalta, mutta sellaista ei löytynyt.
Jos näin olisi, minun ei tarvitsisi vaivautua generointiin, vaan voisin vain muokata vakioita, ja löysin tavan injektoida arvoja käännösaikana, kuten Rustin include_bytes!-makrolla.
Käännösaikainen muuttujan injektio
Käyttö on yksinkertaista.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Jos meillä on yllä oleva koodi, voimme injektoida sen seuraavasti käännöksen yhteydessä.
1go build -ldflags="-X 'main.Foo=bar'"
Kun argumentti välitetään ldflag-lipulla, bar-arvo injektoidaan Foo-muuttujaan käännösaikana. Se on yksinkertaista.
Jos samannimisiä paketteja tai muuttujia on useita projektissa, paketin polku on määritettävä.
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ällaisessa tapauksessa injektio voidaan tehdä erottamalla ne 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, on vain välitettävä 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: Pienellä kirjaimella alkavat muuttujat voidaan myös injektoida.
- Tukee vain string-tyyppiä: Muita tyyppejä ei tueta.