Compile-Time Variable Injection pada Go
Latar Belakang
Kali ini, saat mengerjakan proyek perusahaan, saya mencari tahu apakah ada cara untuk menyuntikkan variabel pada compile time tanpa menggunakan .env
.
Dengan demikian, saya pikir akan sangat nyaman karena hanya membutuhkan satu berkas tanpa perlu .env
atau beberapa berkas konfigurasi lainnya.
Awalnya, saya mencari CLI go:generate
yang dapat menghasilkan berkas constant berdasarkan .env
, tetapi tidak menemukannya.
Namun, jika demikian, saya bisa saja langsung mengubah constants tanpa perlu melakukan gen yang merepotkan, dan saya menemukan cara untuk menyuntikkan nilai pada compile time seperti makro include_bytes!
di Rust.
Penyuntikan Variabel pada Compile Time
Cara penggunaannya sederhana.
1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8 fmt.Println(Foo)
9}
Jika ada kode seperti di atas, variabel dapat disuntikkan saat build sebagai berikut.
1go build -ldflags="-X 'main.Foo=bar'"
Jika argumen diteruskan melalui ldflag
, nilai bar
akan disuntikkan ke variabel Foo
pada compile time saat build. Sederhana.
Jika ada beberapa package atau variabel dengan nama yang sama dalam proyek, Anda cukup menyebutkan jalur package.
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
Dalam kasus seperti ini, variabel dapat disuntikkan dengan membedakannya sebagai berikut:
1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
Jika ada beberapa variabel dalam package yang sama, Anda cukup meneruskan argumen tambahan.
1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"
Fitur-fiturnya adalah sebagai berikut:
- Variabel tidak harus public: Variabel yang dimulai dengan huruf kecil juga dapat disuntikkan.
- Hanya mendukung type string: Type lain tidak didukung.