英文:
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
So please do what @Volker said:
- Don't set
GOROOT
. - Don't use
-a
withgo build
.
Also condier using go install
instead of go build
— for the reasons
explained here.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论