【问题标题】:How to set `-ldflags` values for each target in Goreleaser?如何为 Goreleaser 中的每个目标设置 `-ldflags` 值?
【发布时间】:2020-11-18 09:47:00
【问题描述】:

我需要为每个构建目标设置 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"

这是有道理的。但是现在我关心如何为每个目标设置目标特定变量?

【问题讨论】:

    标签: go goreleaser


    【解决方案1】:

    在这些钩子中导出的变量不会泄漏到构建器本身。

    但是,您可以执行以下操作:

    source variables.sh
    goreleaser release --rm-dist
    

    并且变量应该在模板上的.Env 映射中可用。

    PS:你不需要设置GOOSGOARCH,GoReleaser 会帮你设置。

    PPS:build time and commit are available as native template variables/functions

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2012-11-29
      相关资源
      最近更新 更多