golang build -i -a 失败(权限被拒绝)

huangapple go评论82阅读模式
英文:

golang build -i -a fails (permission denied)

问题

我是一个Go语言的新手。

我已经从官方二进制发行版在我的Ubuntu上安装了Go 1.9。我还安装了Gogland IDE。

当我尝试使用Gogland调试最简单的Go程序("hello world")时,我遇到了以下错误:

GOROOT=/usr/local/go
GOPATH=/home/user/go
/usr/local/go/bin/go build -i -o /tmp/defaultgo -gcflags "-N -l" -a /home/user/go/src/hello/hello.go
go install runtime/internal/sys: open /usr/local/go/pkg/linux_amd64/runtime/internal/sys.a: permission denied

当我尝试从命令行构建(而不是使用Gogland)时,我注意到只要我使用-i -a开关,就会出现相同的错误。

英文:

I am a go newbie.

I have installed golang 1.9 from the official binary distribution on my ubuntu. I have also installed the Gogland IDE.

When I try to debug the simplest go program ("hello world") using Gogland, I get the following error:

GOROOT=/usr/local/go
GOPATH=/home/user/go
/usr/local/go/bin/go build -i -o /tmp/defaultgo -gcflags "-N -l" -a /home/user/go/src/hello/hello.go
go install runtime/internal/sys: open /usr/local/go/pkg/linux_amd64/runtime/internal/sys.a: permission denied

When trying to build from the command line (not using Gogland), I noticed that I get the same error whenever I am using the -i -a switches.

答案1

得分: 4

这是因为Delve对Go 1.9项目的支持升级了。最新版本的Delve将使用-a来重新编译所有的传递依赖项,并确保它们不包含优化版本,而是包含调试友好版本,以便消除许多潜在的错误。

您可以删除-i标志,以便不安装依赖项,这样就不会再出现错误了。

希望在Go 1.10中会有所改进,因为这涉及到Go团队的更改。

如果这样还无法解决问题,请参考这里的讨论:https://youtrack.jetbrains.com/issue/GO-4382

编辑:这个问题将在即将发布的EAP 13中得到解决,详细信息请参见此跟踪问题:https://youtrack.jetbrains.com/issue/GO-4430

英文:

Edit: EAP 13 was just released and it fixes this specific problem. Please see: https://blog.jetbrains.com/go/2017/09/04/gogland-eap-13-better-completion-new-inspections-fixed-performance-bugs-and-more/

Original:

This happens because of upgraded support from Delve for Go 1.9 projects.

The latest version of Delve will use -a in order to recompile all transitive dependencies and ensure none of them are included with their optimized versions instead of the debugging friendly ones so that it can remove a lot of potential bugs.

You can remove the -i flag so that the dependencies are not installed, which shouldn't cause the error anymore.

This will be improved hopefully in Go 1.10 as there are changes depending on the Go team.

Hope this explains the issue, if not, please see the discussion here: https://youtrack.jetbrains.com/issue/GO-4382

Edit: this will be addressed in the EAP 13, which is bound to be released very soon, see the tracking issue here: https://youtrack.jetbrains.com/issue/GO-4430 as it contains additional details regarding this problem

答案2

得分: 0

-a命令行选项告诉go工具重新构建“所有Go内容”,这包括Go标准库甚至Go运行时本身——这些与每个Go程序链接的内容实际上实现了goroutine和其他有趣的部分。

由于您将Go安装到通常不可写的位置(/usr/local/go),尝试重新编译和更新文件(/usr/local/go/pkg)会因为“权限被拒绝”而失败。

主要的要点是,在您完全理解自己想要实现的内容之前,您不需要在go build中使用-a选项,这将在您的学习过程中稍后涉及到;-)

所以请按照@Volker的建议进行操作:

  • 不要设置GOROOT
  • 不要在go build中使用-a

此外,考虑使用go install而不是go build,原因在这里有解释。

英文:

The -a command-line option tells the go tool to rebuild "everything Go", and this includes the Go standard library and even the Go runtime itself—that stuff linked to each Go program which actually implements goroutines and all the interesting bits.

Since you have Go installed into a location not normally writable by end users (/usr/local/go), an attempt to recompile and update files there (/usr/local/go/pkg) rightfully fails with "permission denied".

The main takeaway is that there is exactly zero cases you'd need to pass -a to go build until you very well understand what you want to achieve, and this will come quite later in your learning curve golang build -i -a 失败(权限被拒绝)

So please do what @Volker said:

  • Don't set GOROOT.
  • Don't use -a with go build.

Also condier using go install instead of go build — for the reasons
explained here.

huangapple
  • 本文由 发表于 2017年9月4日 16:09:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/46032811.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定