Go'daki Compile-Time Variable Injection
Arka Plan
Bu kez şirket projesi üzerinde çalışırken, .env olmaksızın derleme zamanında değişkenleri enjekte etmenin bir yöntemi olup olmadığını araştırdım. Bu sayede, .env veya çeşitli yapılandırma dosyaları olmaksızın yalnızca tek bir dosyanın yeterli olacağını düşündüğüm için bunun oldukça kullanışlı olacağını değerlendirdim.
Öncelikle, .env temel alarak sabit dosyalar oluşturan go:generate CLI benzeri bir araç aradım, ancak mevcut değildi.
Ancak bu durumda, sadece constants'ı değiştirmek yeterli olacağından zahmetli bir gen işlemine gerek kalmamaktaydı; bunun yerine Rust'taki include_bytes! makrosu gibi derleme zamanında değerleri enjekte edebilecek bir yöntem buldum.
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 kodun mevcut olduğunu varsayarsak, build esnasında aşağıdaki gibi enjekte edilebilir.
1go build -ldflags="-X 'main.Foo=bar'"
ldflag ile argümanlar iletildiğinde, build esnasında derleme zamanında Foo değişkenine bar değeri enjekte edilmektedir. Basittir.
Eğer projede aynı isme sahip package veya değişken birden fazla konumda bulunuyorsa, package yolunu belirtmek gerekmektedir.
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 gibi durumlarda, 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ı package içerisinde birden fazla değişkenin bulunması durumunda dahi, sadece ek argümanlar iletmek yeterlidir.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Özellikler aşağıdaki gibidir:
- Değişkenin public olması zorunlu değildir: Küçük harfle başlayan değişkenler de enjekte edilebilir.
- Yalnızca string türünü desteklemektedir: Diğer türler desteklenmemektedir.