小白,Macos下Goland-go build配置运行项目,发生如下错误:
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/zhaoheng/GO #gosetup
/usr/local/go/bin/go build -i -o /Users/xxx/Desktop/work/go/xxx/bin/test/run_test xxx/cmd/test #gosetup
go build runtime/cgo: copying /Users/xxx/Library/Caches/go-build/c9/c98ec99950f6a719f87ae12ba24830893366a8e8b6fde1fe2e8cf8721f80e922-d: open /usr/local/go/pkg/darwin_amd64/runtime/cgo.a: permission denied
Compilation finished with exit code 1
处理过程记录:
- 同样的go build配置,调试状态启动正常。直接命令行go build,go run可以正常启动
- 在网络上找到的大概有三条,
- 目录权限问题,给日志中的路径加权限,eg:sudo chmod -R 777 xxx ###无效
- 取消go build配置中的 Run with Sudo ###无效
- 禁用CGO,添加环境变量 export CGO_ENABLED=0 ###无效
-
思考下:
既不是权限问题,不是cgo问题,debug又能正常启动,那就只剩下一种可能,run和debug的启动参数不同,于是注意到日志中有 /usr/local/go/bin/go build -i -o 两个运行参数。-o不提,go help build
得到:The -i flag installs the packages that are dependencies of the target.
安装作为目标依赖项的包。再根据日志基本确定是从系统目录拷贝cgo.a到运行时产生的中间目录时权限不足导致的。
实际上是用于增量编译,缓存一些依赖库到build中间目录,其中就包括cgo.a,这个文件对于非root用户是readOnly权限,但build错误日志中却要open该文件,所以权限不足。
解决:
- 方法一:取消掉go build -i
- 方法二:添加权限
sudo chown -R /usr/local/go/pkg/darwin_amd64/
项目不大,且golang编译速度很快,还是方法一取消增量编译更安全方便