---
id: 1872edeaa3c5fc09a1eba338cf2b01b1
author: wHoIsDReAmer
title: 'Wstrzykiwanie zmiennych w czasie kompilacji w Go: zastosowanie go build -ldflags -X'
description: Omówienie sposobu wstrzykiwania wartości zmiennych tekstowych Go w czasie kompilacji, bez zewnętrznego pliku .env, z wykorzystaniem flagi linkera go build -ldflags "-X" oraz wskazaniem ścieżki symbolu pakietu.
language: pl
date: 2025-06-01T15:56:46.352281271Z
path: /blog/posts/compile-time-variable-injection-of-go-z5420556c
category: api
---

## Tło

Pracując nad projektem firmowym, sprawdziłem, czy istnieje sposób na wstrzykiwanie zmiennych w czasie kompilacji bez użycia pliku `.env`. Pomyślałem, że byłoby to bardzo wygodne, ponieważ wystarczyłby jeden plik, bez `.env` i wielu plików konfiguracyjnych.

Na początku szukałem narzędzia CLI dla `go:generate`, które generowałoby plik ze stałymi na podstawie `.env`, ale takiego nie znalazłem.

Skoro jednak i tak miałbym to zrobić, to lepiej po prostu zmodyfikować constants, bez zawracania sobie głowy generowaniem. Znalazłem wtedy sposób, który przypomina makro `include_bytes!` z Rusta, pozwalający wstrzyknąć wartość w czasie kompilacji.

## Wstrzykiwanie zmiennych w czasie kompilacji

Sposób użycia jest prosty.

```go
package main

import "fmt"

var Foo string

func main() {
    fmt.Println(Foo)
}
```

Mając powyższy kod, podczas budowania można wstrzyknąć wartość w następujący sposób.

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

Przekazując argument przez ldflag, wartość `bar` zostaje wstrzyknięta do zmiennej `Foo` w czasie kompilacji. To proste.

Jeśli w projekcie istnieją pakiety lub zmienne o tej samej nazwie w wielu miejscach, wystarczy **podać ścieżkę pakietu**.

```go
// github.com/myproject/config/config.go
package config

var Version string

// github.com/myproject/internal/config/config.go
package config

var BuildTime string
```

W takim przypadku można rozróżnić je w następujący sposób:

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

Również gdy w jednym pakiecie znajduje się wiele zmiennych, wystarczy przekazać dodatkowe argumenty.

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

Charakterystyka tego rozwiązania jest następująca:

- **Zmienna nie musi być publiczna**: można wstrzyknąć również zmienną zaczynającą się od małej litery
- **Obsługiwany jest wyłącznie typ string**: inne typy nie są obsługiwane

## Odniesienia

- [https://stackoverflow.com/questions/47509272/how-to-set-package-variable-using-ldflags-x-in-golang-build](https://stackoverflow.com/questions/47509272/how-to-set-package-variable-using-ldflags-x-in-golang-build)
