我最近使用CentOS 6.3安装了Go到我们的服务器上.安装似乎没有问题.但是我做了一个测试"hello world"脚本,当我运行时,我得到以下输出.
fork/exec /tmp/go-build967564990/command-line-arguments/_obj/a.out: permission denied
Run Code Online (Sandbox Code Playgroud)
现在运行go env或其他go命令似乎工作.起初我认为这是一个权限问题,但是以root用户身份运行我得到同样的东西.一个
我正在开发一个 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”命令也会检测到GOOS和GOARCHenv var,这会导致该步骤失败,因为显然不支持跨平台测试。
换句话说,就像我想清除“测试”目标的环境变量,但下面的示例似乎没有按预期取消设置变量:
unexport GOOS
unexport GOARCH
test: fmt vet
go test ./...
Run Code Online (Sandbox Code Playgroud)
我可以删除“构建”目标的“测试”依赖项,它工作正常,但这似乎是错误的方法,因为如果测试失败,我不想构建或发布二进制文件。
我是否可以以某种方式修改 Makefile,以便由“release”目标设置GOOS并由GOARCH“build”目标使用环境变量,而不是由依赖的“test”目标使用?
是否有其他方法可以交叉编译发布并仍然作为依赖项运行测试而不会使事情变得复杂(例如通过 Docker 构建等)?请注意,由于发布和构建目标有多个标志,因此 make 目标比上面的示例稍微复杂一些。