GoSuda

Go:n Compile-Time Variable Injection

By wHoIsDReAmer
views ...

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.

Viitteet