Как установить значения `-ldflags` для каждой цели в Goreleaser?
Мне нужно установить переменную Os/Arch для каждой цели сборки. Моя первоначальная мысль заключалась в том, чтобы иметь сценарий, который будет вычислять эти переменные и использовать хуки для запуска этого сценария на каждой цели.
.goreleaser.yaml
:
builds:
hooks:
pre:
- sh variables.sh
ldflags:
- -s -w -X "main.goversion={{.Env.GOVERSION}}"
- -s -w -X "main.commit={{.Env.GITCOMMIT}}"
- -s -w -X "main.os={{.Env.GOOS}}"
- -s -w -X "main.arch={{.Env.GOARCH}}"
- -s -w -X "main.commit={{.Env.GITCOMMIT}}"
- -s -w -X "main.date={{.Env.BUILDTIME}}"
variables.sh
#!/bin/bash
export GITCOMMIT=${GITCOMMIT:-$(git rev-parse --short HEAD 2> /dev/null || true)}
export BUILDTIME=${BUILDTIME:-$(date -u +"%Y-%m-%dT%H:%M:%SZ")}
export GOOS="${GOOS:-$(go env GOHOSTOS)}"
export GOARCH="${GOARCH:-$(go env GOHOSTARCH)}"
export GOVERSION=$(go version | awk '{print $3;}')
Но поскольку переменные нигде не определены в конфигурации, кажется, что он не может их распознать, бросая:
release failed after 0.45s error=template: tmpl:1:31: executing "tmpl" at <.Env.GOVERSION>: map has no entry for key "GOVERSION"
В этом есть смысл. Но теперь меня беспокоит, как мне установить целевые переменные для каждой цели?
1 ответ
Переменные, экспортированные с помощью этих хуков, не попадут в сам конструктор.
Однако вы можете сделать что-то вроде:
source variables.sh
goreleaser release --rm-dist
и переменные должны быть доступны в
.Env
карта по шаблонам.
PS: устанавливать не нужно
GOOS
и
GOARCH
GoReleaser сделает это за вас.PPS: время сборки и фиксация доступны как собственные переменные / функции шаблона