特定目标的 Makefile 环境变量

mae*_*ics 3 makefile go

我正在开发一个 go 项目,它的 Makefile 如下所示。请注意,“release”目标设置了两个环境变量,以便“build”目标针对特定体系结构(可能不是构建系统的体系结构)进行交叉编译。

# 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 ./...

...
Run Code Online (Sandbox Code Playgroud)

问题在于“go test”命令也会检测到GOOSGOARCHenv var,这会导致该步骤失败,因为显然不支持跨平台测试

换句话说,就像我想清除“测试”目标的环境变量,但下面的示例似乎没有按预期取消设置变量:

unexport GOOS
unexport GOARCH
test: fmt vet
    go test ./...
Run Code Online (Sandbox Code Playgroud)

我可以删除“构建”目标的“测试”依赖项,它工作正常,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。

我是否可以以某种方式修改 Makefile,以便由“release”目标设置GOOS并由GOARCH“build”目标使用环境变量,而不是由依赖的“test”目标使用?

是否有其他方法可以交叉编译发布并仍然作为依赖项运行测试而不会使事情变得复杂(例如通过 Docker 构建等)?请注意,由于发布和构建目标有多个标志,因此 make 目标比上面的示例稍微复杂一些。

Bet*_*eta 5

我会这样做:

test: export GOOS=
test: export GOARCH=
test: fmt vet
    go test ./...
Run Code Online (Sandbox Code Playgroud)