Go Derleme Zamanı Değişken Enjeksiyonu: go build -ldflags -X Kullanımı

Arka Plan
Bu sefer şirket projesinde çalışırken, .env dosyası olmadan derleme zamanında değişken enjekte etmenin bir yolu olup olmadığını araştırdım.
Bunu yapabilirsek .env dosyaları veya birden fazla yapılandırma dosyası olmadan yalnızca tek bir dosyanın bulunması yeterli olacağı için son derece kullanışlı olacağını düşündüm.
İlk olarak .env dosyasından bir sabit dosyası üreten go:generate CLI benzeri bir araç aradım, ancak böyle bir araç bulamadım.
Oysa bunun için zaten constants dosyasını düzenlemek yeterliyken gen adımını ayrıca çalıştırmaya gerek yoktu. Bunun yerine Rust'taki include_bytes! makrosu gibi derleme zamanında değer enjekte edebilen bir yöntem buldum.
Derleme Zamanında 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 kodunuz olduğunu varsayarsak, derleme sırasında şu şekilde enjekte edebilirsiniz.
1go build -ldflags="-X 'main.Foo=bar'"
ldflag ile argüman geçirildiğinde, derleme zamanında Foo değişkenine bar değeri enjekte edilir. Oldukça basit.
Projenizde aynı isme sahip paket veya değişkenler birden fazla yerde bulunuyorsa, paket yolunu belirtmeniz 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 şekilde ayırt ederek enjekte edebilirsiniz:
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 olduğunda da ek argümanları iletmeniz yeterlidir.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Özellikleri şunlardır:
- Değişkenin public olması gerekmez: Küçük harfle başlayan değişkenlere de enjeksiyon yapılabilir.
- Yalnızca string türü desteklenir: Diğer türler desteklenmez.