Go'da Derleme Zamanı Değişken Enjeksiyonu
Arka Plan
Bu defa bir şirket projesi üzerinde çalışırken, .env dosyası olmadan derleme zamanında değişken enjekte etmenin bir yolu olup olmadığını araştırdım. Bunun, .env veya birden fazla yapılandırma dosyası yerine yalnızca tek bir dosyaya ihtiyaç duyulduğu için son derece kullanışlı olacağını düşündüm.
Başlangıçta aradığım şey, .env dosyasına dayalı bir sabit dosyası oluşturan go:generate CLI benzeri bir şeydi, ancak bulamadım.
Ancak, öyle olsaydı, constants'ı doğrudan değiştirmek zaten yeterli olurdu ve zahmetli bir "gen" işlemine gerek kalmazdı; bu nedenle, Rust'taki include_bytes! makrosu gibi derleme zamanında değerleri enjekte edebilecek bir yöntem aradım.
Derleme Zamanı Değişken Enjeksiyonu
Kullanımı basittir.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Yukarıdaki gibi bir kod mevcutsa, derleme sırasında aşağıdaki gibi enjekte edilebilir:
1go build -ldflags="-X 'main.Foo=bar'"
ldflag aracılığıyla argümanlar iletildiğinde, derleme sırasında Foo değişkenine bar değeri enjekte edilir. Bu basittir.
Eğer projede aynı ada sahip paketler veya değişkenler birden fazla yerde bulunuyorsa, paket yolunu belirtmek yeterlidir.
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
Bu durumda, aşağıdaki gibi ayrı ayrı enjekte edilebilir:
1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
Aynı pakette birden fazla değişken olması durumunda da ek argümanlar iletmek yeterlidir.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Özellikleri aşağıdaki gibidir:
- Değişkenlerin public olmasına gerek yoktur: Küçük harfle başlayan değişkenler de enjekte edilebilir.
- Yalnızca string tipi desteklenir: Diğer tipler desteklenmez.