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 привел меня в нужное место, но это был не полный пример кода, отвечающий на вопрос. Требовалась пара изменений:
- Объявите версию как
var version string
версии var version string
- Скомпилируйте с
-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