我正在研究一个go项目,该项目具有如下所示的Makefile。请注意,“发布”目标设置了两个环境变量,以便“构建”目标针对特定体系结构(可能不是构建系统的体系结构)进行交叉编译。
# 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
的环境变量,导致该步骤从cross-platform testing apparently is not supported开始失败。
换句话说,这就像我要清除“测试”目标的环境变量,但是下面的示例似乎并未按预期取消设置变量:
unexport GOOS
unexport GOARCH
test: fmt vet
go test ./...
我可以删除“构建”目标的“测试”依赖关系,它可以正常工作,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。
我可以以某种方式修改Makefile,以使GOOS
和GOARCH
环境变量由“发布”目标设置并由“构建”目标使用,而不由从属“测试”目标使用吗?
也许还有其他方法可以交叉编译以发布并仍将测试作为依赖项运行,而不会使事情复杂化(例如通过Docker进行构建等)?请注意,由于发布和构建目标有多个标志,因此make目标比上面的示例要复杂一些。
答案 0 :(得分:1)
为什么不做这样的事情?它只会在执行go
期间设置这些环境变量。
# Generates a container release artifact.
release: build
docker build ...
# Generates an executable for local use.
build: test
GOOS=linux GOARCH=amd64 go build ...
test: fmt vet
go test ./...
...
答案 1 :(得分:1)
我会这样:
non_local_traffic: yes
答案 2 :(得分:0)
我只是意识到我可以在麻烦的测试命令本身中取消设置环境变量:
test: fmt vet
GOOS= GOARCH= go test ./...
通过这种方式,“ go test”命令将始终使用本地系统的操作系统和体系结构(应如此!)。
Thx @KonstantinItskov获得灵感