Golang компилирует переменную среды в двоичную

Если я скомпилирую эту программу

package main

import (
    "fmt"
    "os"
)

var version = os.Getenv("VERSION")

func main() {
    fmt.Println(version)
}

Он печатает ENV Var, когда я запускаю его

VERSION="0.123" ./example
> 0.123

Есть ли способ скомпилировать env var в двоичный файл, например:

VERSION="0.123" go build example.go

Затем получите тот же вывод при запуске

./example

Ответ 1

Перейти 1,5 и выше редактировать:

На данный момент синтаксис изменился. Используйте

go build -ldflags "-X main.Version=$VERSION"

в Linux, а в Windows -

go build -ldflags "-X main.Version=%VERSION%"

Для этого используется флаг компоновщика -X. В вашем случае вы бы сделали

go build -ldflags "-X main.Version $VERSION"

Изменить: в Windows это будет

go build -ldflags "-X main.Version %VERSION%"

Дополнительная информация в документах компоновщика.

Ответ 2

Ответ Ainer-G привел меня в нужное место, но это был не полный пример кода, отвечающий на вопрос. Требовалась пара изменений:

  1. Объявите версию как var version string версии var version string
  2. Скомпилируйте с -X main.version=$VERSION

Вот полный код:

package main

import (
    "fmt"
)

var version string

func main() {
    fmt.Println(version)
}

Теперь скомпилируйте с

go build -ldflags "-X main.version=$VERSION"

Ответ 3

Существует функция os.Setenv(), которую вы можете использовать для установки переменных среды.

Итак, вы можете запустить свое приложение, установив переменную среды следующим образом:

func init() {
    os.Setenv("VERSION", "0.123")
}

Если вы не хотите делать это с помощью "руки", вы можете создать инструмент для этого, который будет читать текущее значение переменной среды VERSION и сгенерировать исходный файл .go в вашем пакете, содержащий точно как и код выше (за исключением использования текущего значения переменной среды VERSION). Вы можете запустить такое генерирование кода, выпустив команду go generate.

Подробнее читайте Создание кода для более подробной информации о go generate.

Ответ 4

Самое простое решение, просто цепочка команд:

Вместо:

VERSION="0.123" go build example.go

Делать:

go build example.go && VERSION="0.123" ./example