Injeksi Variabel Compile-Time Go
Latar Belakang
Kali ini, saat mengerjakan proyek perusahaan, saya mencari tahu apakah ada cara untuk menginjeksi variabel pada waktu kompilasi tanpa .env.
Saya pikir ini akan sangat nyaman karena hanya membutuhkan satu file tanpa .env atau beberapa file konfigurasi.
Awalnya, saya mencari CLI go:generate yang dapat membuat file konstanta berdasarkan .env, tetapi tidak ada.
Namun, jika demikian, saya bisa langsung mengubah konstanta tanpa perlu repot membuat gen, dan saya menemukan cara untuk menginjeksi nilai pada waktu kompilasi seperti makro include_bytes! di Rust.
Injeksi Variabel Waktu Kompilasi
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, Anda dapat menginjeksinya sebagai berikut saat membangun.
1go build -ldflags="-X 'main.Foo=bar'"
Jika argumen diteruskan sebagai ldflag, nilai bar akan diinjeksi ke variabel Foo pada waktu kompilasi saat build. Ini sederhana.
Jika ada beberapa paket atau variabel dengan nama yang sama dalam proyek, Anda hanya perlu menentukan jalur paket.
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 ini, Anda dapat membedakan dan menginjeksi sebagai berikut:
1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"
Bahkan jika ada beberapa variabel dalam paket 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'"
Karakteristiknya adalah sebagai berikut:
- Variabel tidak harus public: Variabel yang dimulai dengan huruf kecil juga dapat diinjeksi.
- Hanya mendukung tipe string: Tipe lain tidak didukung.