【发布时间】:2019-05-06 15:15:58
【问题描述】:
我正在开发一个具有如下 Makefile 的 go 项目。请注意,“发布”目标设置了两个环境变量,以便“构建”目标针对特定架构(可能不是构建系统的架构)进行交叉编译。
# Generates a container release artifact.
release: export GOOS=linux
release: export GOARCH=amd64
release: build
docker build ...
# Generates an executable for local use.
build: test
go build ...
test: fmt vet
go test ./...
...
问题在于 GOOS 和 GOARCH 环境变量也被“go test”命令检测到,这导致该步骤自 cross-platform testing apparently is not supported 以来失败。
换句话说,就像我想清除“测试”目标的环境变量,但下面的示例似乎没有按预期取消设置变量:
unexport GOOS
unexport GOARCH
test: fmt vet
go test ./...
我可以删除“构建”目标的“测试”依赖项,它工作正常,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。
我能否以某种方式修改 Makefile,使 GOOS 和 GOARCH 环境变量由“发布”目标设置并由“构建”目标使用,而不是依赖的“测试”目标?
是否有其他方法可以交叉编译发布,并且仍然将测试作为依赖项运行,而不会使事情变得复杂(例如通过 Docker 构建等)?请注意,由于发布和构建目标的多个标志,make 目标比上面的示例要复杂一些。
【问题讨论】:
-
go 对所有操作系统使用相同的源代码,因此您只需制作 1 个测试文件并将其用于每个操作系统
-
您可以将发布版本和测试移动到 docker 中,在容器中运行它
-
@MadWombat 当然,但我不想为本地和 docker 构建重复 makefile 代码(它比问题中的最小示例中显示的要多得多)。