GoSuda

Inyección de variables en tiempo de compilación en Go: uso de go build -ldflags -X

By wHoIsDReAmer views ...

Contexto

Al trabajar en un proyecto de la empresa, busqué si existía una forma de inyectar variables en tiempo de compilación sin usar .env. Pensé que sería muy cómodo, ya que de este modo solo bastaría con un único archivo, sin necesidad de .env ni de varios archivos de configuración.

Al principio busqué una herramienta CLI de go:generate que generara un archivo de constantes a partir de .env, pero no encontré ninguna.

Sin embargo, si iba a hacer eso, bastaba con modificar directamente las constants, así que no era necesario complicarse con un paso de generación. Entonces encontré en Rust una forma de inyectar valores en tiempo de compilación, como la macro include_bytes!.

Inyección de variables en tiempo de compilación

El uso es sencillo.

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

Dado un código como el anterior, durante la compilación puede inyectarse de la siguiente manera.

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

Al pasar el argumento mediante ldflag, el valor bar se inyecta en la variable Foo durante la compilación. Es simple.

Si en el proyecto existen paquetes o variables con el mismo nombre en varios lugares, basta con especificar la ruta del paquete.

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 pueden inyectar distinguiéndolos 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 cuando hay varias variables en el mismo paquete, basta con pasar argumentos adicionales.

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

Sus características son las siguientes:

  • La variable no necesita ser pública: también es posible inyectar variables que comienzan con minúscula.
  • Solo se admite el tipo string: no se soportan otros tipos.

Referencias