go - 如何为 Goreleaser 中的每个目标设置 `-ldflags` 值?
问题描述
我需要为每个构建目标设置 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"
这是有道理的。但现在我担心如何为每个目标设置目标特定变量?
解决方案
在这些钩子中导出的变量不会泄漏到构建器本身。
但是,您可以执行以下操作:
source variables.sh
goreleaser release --rm-dist
并且变量应该.Env
在模板上的地图中可用。
PS:你不需要设置GOOS
and GOARCH
,GoReleaser 会帮你做。
推荐阅读
- java - 从服务器运行 notes java 代理时没有受信任的证书
- neo4j - 在全文查询中转义 Lucene 特殊字符
- java - java swing表单中的必填文本字段
- javascript - 如何在向下滚动内容时修复导航菜单(二级菜单)?
- scala - 关于 akka 流的聚合指标
- java - 有什么方法可以将 String[] 转换为 List
> 在java中? - java - 我可以在字符串上使用 mod 吗?
- ios - Chrome 中带有音乐的 HTML 5 视频在 Safari 中没有音乐
- c - 使用 3 个线程进行信号处理时,谁是第 4 个线程
- python - 如何在不使用 Matplotlib FuncAnimation 的情况下创建实时图形