go - 如何在 Goreleaser 中为每个目标设置 `-ldflags` 值?

标签 go goreleaser

我需要为每个构建目标设置 Os/Arch 变量。我最初的想法是有一个脚本来计算这些变量并使用钩子(Hook)在每个目标上运行这个脚本。.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"
这是有道理的。但现在我担心如何为每个目标设置目标特定变量?

最佳答案

这些钩子(Hook)中导出的变量不会泄漏到构建器本身。
但是,您可以执行以下操作:

source variables.sh
goreleaser release --rm-dist
并且变量应该在 .Env 中可用在模板上映射。
PS:不需要设置GOOSGOARCH ,GoReleaser 会为您做到这一点。
缴费灵:build time and commit are available as native template variables/functions

关于go - 如何在 Goreleaser 中为每个目标设置 `-ldflags` 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63142826/

相关文章:

go - Go中四舍五入到小数点后2位

Go vs Rust 垃圾收集器性能和类型

golang : client tls. Conn 关闭钩子(Hook)

go - 如何将Go的GC CPU使用率提高到25%以上?

string - Golang 中的 Scanln 不接受空格

go - goreleaser仅在GitHub上生成变更日志