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

Ubuntu golang build-i-a失败(权限被拒绝),ubuntu,go,build,goland,Ubuntu,Go,Build,Goland,我是个新手 我在ubuntu上安装了官方二进制发行版的golang 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 inst

我是个新手

我在ubuntu上安装了官方二进制发行版的golang 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开关时,都会出现相同的错误。

命令行选项告诉go工具重新构建所有go,这包括Go标准库,甚至是Go运行时本身,它链接到每个Go程序,实际实现goroutines和所有有趣的部分

由于您已安装到最终用户通常不可写入的位置/usr/local/Go,因此尝试重新编译和更新那里的文件/usr/local/Go/pkg将理所当然地失败,权限被拒绝

最主要的收获是,你完全没有需要通过的案例——a去构建,直到你非常清楚地理解你想要实现的目标,这将在你的学习曲线中稍后出现-

所以请照@Volker说的做:

不要把它放在地上。 不要将-a与go build一起使用。 另外,condier使用go install而不是go build,原因如下
解释。

编辑:EAP 13刚刚发布,它解决了这个特定问题。请参阅:

原件:

这是因为Delve升级了对Go 1.9项目的支持

Delve的最新版本将使用-a来重新编译所有可传递的依赖项,并确保它们中没有任何一个包含在优化版本中,而不是调试友好的版本中,以便它可以删除许多潜在的bug

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

这将有希望在围棋1.10中得到改进,因为根据围棋团队的不同会有变化

希望这能解释问题,如果不是,请参见此处的讨论:


编辑:这将在即将发布的EAP 13中解决,请参见此处的跟踪问题:因为它包含有关此问题的其他详细信息

1。永远不要让戈鲁特。从不这里没有磁盘。2.可能只是不使用-a。3.使用golang.org上的官方安装,而不是Ubuntu上的。@Volker 1。我没有设置GOROOT。也许当你选择SDK时,gogland会为你做这件事。如果不选择SDK,我无法运行程序?2.似乎gogland默认使用-a。我怎样才能改变这一点?3.我使用了从golang.org下载的官方gogland发行版tar.gz。我没有设置GOROOT。我只选择了gogland的SDK。gogland似乎使用了-a开关,默认情况下为什么?我很确定如何控制它。@MarkM,根据对的评论线程,我可能会建议删除Goglang一段时间,直到它的作者至少了解Go项目应该如何正确构建为止。试着试试VSCODE或者像LITEIDE这样轻的东西。请注意,您可以从流行的文本编辑器Vim、Emacs(包括升华等时髦的东西)中很好地使用Go just Find。@kostix IDE之所以这样做,有很多原因。对于GOROOT,它需要这样做,因为您实际上可以将它配置为在不同的项目中使用不同的Go版本,而不管您的系统中有什么配置。对于go build-a,这样做是为了帮助delve获得更好的调试信息,在go 1.9之前是不可能可靠地完成的。任何使用delve debug package/name的编辑器都会在您不知道发生了什么的情况下自动执行此操作。所以请不要再嘲笑你不懂的东西了。@dlsniper,谢谢你的洞察力。但我不同意设置GOROOT的必要性:最近,也就是说,1.4+,我认为Go的版本只是根据Go二进制文件的位置来计算GOROOT,所以运行类似~/devel/golang1.9/bin/Go env这样的程序完全可以,看到它自己已经将GOROOT设置为~/devel/golang1.9/了。Go 1.9改变了它检测Go安装位置的方式,不是Go 1.4,使GOROOT不那么需要。但是,无法控制用户环境或go的安装方式。例如,您仍然可以从网站上解包Go 1.8 tarball,它将希望Go位于/usr/local/Go中,如果它在那里,它将使用它。对于Windows来说,它与Go在多版本设置中的表现一样/更糟。即使如此,用户可能设置了该变量,但可能会将其设置到不同的位置,等等。希望这有助于理解这一选择背后的复杂性。