Как установить значения `-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 и GOARCHGoReleaser сделает это за вас.PPS: время сборки и фиксация доступны как собственные переменные / функции шаблона

Другие вопросы по тегам