dtmooir3395
dtmooir3395
采纳率0%
2017-09-04 08:09

golang build -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.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • dousuo2812 dousuo2812 4年前

    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

    点赞 评论 复制链接分享
  • duanluan033648 duanluan033648 4年前

    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 with go build.

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

    点赞 评论 复制链接分享

相关推荐