我正在处理一个类似下面的Makefile的Go项目。请注意,“release”目标设置了两个环境变量,以便“build”目标可以进行交叉编译以针对特定架构(可能不是构建系统的架构)。"最初的回答"
问题在于"go test"命令也会检测到"GOOS"和"GOARCH"环境变量,这导致该步骤失败,因为显然不支持跨平台测试。
换句话说,就像我想清除"test"目标的环境变量,但是下面的示例似乎没有按预期取消设置变量。
我可以为“build”目标删除“test”依赖项,这样就能正常运行,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。
我是否可以以某种方式修改Makefile,使得“release”目标设置
也许还有其他方法进行跨平台编译并作为依赖项运行测试,而不会使事情变得更加复杂(例如通过Docker构建等)。请注意,由于发布和构建目标有几个标志,因此make目标比上面的示例要复杂一些。
# 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 ./...
...
问题在于"go test"命令也会检测到"GOOS"和"GOARCH"环境变量,这导致该步骤失败,因为显然不支持跨平台测试。
换句话说,就像我想清除"test"目标的环境变量,但是下面的示例似乎没有按预期取消设置变量。
unexport GOOS
unexport GOARCH
test: fmt vet
go test ./...
我可以为“build”目标删除“test”依赖项,这样就能正常运行,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。
我是否可以以某种方式修改Makefile,使得“release”目标设置
GOOS
和GOARCH
环境变量,并由“build”目标使用,但不使用相关的“test”目标?也许还有其他方法进行跨平台编译并作为依赖项运行测试,而不会使事情变得更加复杂(例如通过Docker构建等)。请注意,由于发布和构建目标有几个标志,因此make目标比上面的示例要复杂一些。