GoSuda

Compile-Time Variable Injection de Go

By wHoIsDReAmer
views ...

Antecedentes

Esta vez, mientras trabajaba en un proyecto de la empresa, busqué si había una forma de inyectar variables en tiempo de compile time sin .env. Haciendo esto, pensé que sería muy conveniente porque solo se necesitaría un único archivo sin .env o varios config files.

Lo primero que busqué fue algo como un go:generate CLI que generara un constants file basado en .env, pero no existía.

Pero si ese fuera el caso, simplemente se podrían modificar las constants y no habría necesidad de generar nada de forma engorrosa, y encontré un método para inyectar valores en tiempo de compile time como la macro include_bytes! en Rust.

Inyección de variables en tiempo de compile time

La forma de uso es simple.

1package main
2
3import "fmt"
4
5var Foo string
6
7func main() {
8    fmt.Println(Foo)
9}

Si se tiene un code como el anterior, al hacer build se puede inyectar de la siguiente manera.

1go build -ldflags="-X 'main.Foo=bar'"

Si se pasan arguments con ldflag, al hacer build en tiempo de compile time el valor bar se inyecta en la variable Foo. Es simple.

Si en el project hay packages o variables con el mismo nombre en varios lugares, se debe especificar la ruta del 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

En estos casos, se puede inyectar separando de la siguiente manera:

1go build -ldflags="-X 'github.com/myproject/config.Version=v1.0.0' -X 'github.com/myproject/internal/config.BuildTime=2025-05-27'"

Incluso si en el mismo package hay varias variables, simplemente se pueden pasar arguments adicionales.

1go build -ldflags="-X 'main.Version=v1.0.0' -X 'main.BuildTime=2025-05-27' -X 'main.GitCommit=abc123'"

Las características son las siguientes:

  • La variable no necesita ser public: También es posible inyectar variables que empiezan con minúscula.
  • Solo soporta tipo string: No soporta otros types.

Referencias