【问题标题】:Makefile environment variable for specific target特定目标的 Makefile 环境变量
【发布时间】: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 ./...

...

问题在于 GOOSGOARCH 环境变量也被“go test”命令检测到,这导致该步骤自 cross-platform testing apparently is not supported 以来失败。

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

unexport GOOS
unexport GOARCH
test: fmt vet
    go test ./...

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

我能否以某种方式修改 Makefile,使 GOOSGOARCH 环境变量由“发布”目标设置并由“构建”目标使用,而不是依赖的“测试”目标?

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

【问题讨论】:

  • go 对所有操作系统使用相同的源代码,因此您只需制作 1 个测试文件并将其用于每个操作系统
  • 您可以将发布版本和测试移动到 docker 中,在容器中运行它
  • @MadWombat 当然,但我不想为本地和 docker 构建重复 makefile 代码(它比问题中的最小示例中显示的要多得多)。

标签: go makefile


【解决方案1】:

我会这样做:

test: export GOOS=
test: export GOARCH=
test: fmt vet
    go test ./...

【讨论】:

  • 是的,这很好用,而且读起来可能比我的解决方案好一点。最终这是正确的解决方法,因为测试只能在本地平台上完成,所以永远不应该为测试目标设置这些环境变量。 Nit:拼写文本/测试
【解决方案2】:

为什么不做这样的事情呢?它只会在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 ./...

...

【讨论】:

  • 因为我还想构建可执行文件以在本地系统上使用。所以“build”只能在通过“release”调用时进行交叉编译。
  • 啊……完全有道理。在这种情况下,您有两个选择。一种。将环境变量定义放入 Dockerfile 或 b.在运行两个不同的 go build ... 的 Makefile 中编写一个 if 语句
  • 或c。编写另一个由release 运行的 Makefile 目标器,与您在本地运行的目标器分开。不要过度设计。 :)
  • 啊等等 - 您对在命令行上设置环境变量的观察启发了答案,我可以在“测试”命令上取消设置它们,以便它使用本地系统 os/arch!
【解决方案3】:

我刚刚意识到我可以在麻烦的测试命令本身中取消设置环境变量:

test: fmt vet
    GOOS= GOARCH= go test ./...

这样,“go test”命令将始终使用本地系统操作系统和架构(应该如此!)。

感谢@KonstantinItskov 的启发

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2011-03-23
    • 1970-01-01
    • 2017-03-17
    • 2020-01-19
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多