golang:go install尝试使用/ usr / local代替GOPATH

This is somewhat a follow-up to my last question: golang: installing packages in a local directory

I have GOPATH set to $HOME/prog/go/gopath and this path exists with three directories:

~/prog/go/gopath$ ls
bin  pkg  src

Now I try to install a module to access the redis database which asks me to run

go install

inside the source directory. But the command go install gives me

~/prog/go/gopath/src/redis (go1)$ go install
go install flag: open /usr/local/go/pkg/darwin_amd64/flag.a: permission denied
~/prog/go/gopath/src/redis (go1)$ echo $GOPATH 
<myhomedir>/prog/go/gopath

(where <myhomedir> is a valid path)

Question 1: why does go install not take $GOPATH into account? Question 2: how to convince go install to use $GOPATH?

Not sure how you setup go but it's possible that it needs to build packages from std library but can't due to permissions. You can try

cd /usr/local/go/src
sudo ./all.bash

This should build the std library and run tests to make sure everything is ok.

Make sure you have proper permissions to read and execute from $GOROOT as necessary. Personally I just download the archive from golang.org and keep it under ~/local/go and set GOROOT appropriately.

I think the command you need is "go get":

go get github.com/alphazero/Go-Redis

will download the Go-Redis library and put it into your $GOPATH/src directory.

go install performs a compile and install on your own source code.

I must admit, I struggled with this whole concept for a bit, but a careful re-reading of "How to Write Go" and the code organization section contains what you need to know about how the go command works.

The solution is remove GOROOT from your .bash_profile. Then the go command will install it to your GOPATH directory. And so strange is: when I set the GOROOT in my .bash_profile again and create a new shell, it also works.

Similar problems here. When I check my $GOROOT, I find that all the libraries are already built there. But for some reasons, it tries to rebuild all the libraries. So I just do a little trick:

find /usr/lib/go/pkg/ -name "*.*" | sudo xargs touch

Then everything just work fine.