【问题标题】:golang: go install tries /usr/local instead of GOPATHgolang: go install 尝试 /usr/local 而不是 GOPATH
【发布时间】:2012-09-13 03:48:35
【问题描述】:

这是我上一个问题的后续:golang: installing packages in a local directory

我将GOPATH 设置为$HOME/prog/go/gopath,并且此路径存在三个目录:

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

现在我尝试安装一个要求我运行的module to access the redis database

go install

在源目录中。但是命令go install 给了我

~/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

(其中&lt;myhomedir&gt; 是有效路径)

问题一:为什么go install 不考虑$GOPATH? 问题二:如何说服go install使用$GOPATH

【问题讨论】:

    标签: installation go local


    【解决方案1】:

    不确定您的设置方式,但它可能需要从 std 库构建包,但由于权限而不能。你可以试试

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

    这应该构建标准库并运行测试以确保一切正常。

    确保您有适当的权限在必要时从 $GOROOT 读取和执行。就我个人而言,我只是从 golang.org 下载存档并将其保存在 ~/local/go 下并适当地设置 GOROOT。

    【讨论】:

    • 我不确定我是否理解它的作用。到目前为止,我的 go 安装工作正常。从来没有任何问题,甚至交叉编译也能正常工作。
    • 您是否有权限阅读 /usr/local/go/pkg/darwin_amd64/flag.a ?
    • 是的,我可以作为主要用户阅读/usr/local/go/pkg/darwin_amd64/flag.a
    • 我遇到了同样的问题并以 root 身份运行 ./all.bash 修复了它。不确定交易是什么:我对 .a 的权限是正确的,它似乎正在尝试重建已经构建的包。可能与时间戳有关。
    【解决方案2】:

    这里有类似的问题。当我检查我的 $GOROOT 时,我发现所有的库都已经建在那里了。但由于某些原因,它会尝试重建所有库。所以我只是做了一个小技巧:

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

    然后一切正常。

    【讨论】:

    • 由于 $GOROOT/src 和 $GOROOT/pkg 中的文件之间的时间戳不同,pkg 文件被确定为过期并正在尝试重建。但是因为它们不能被用户写入,所以会出现权限被拒绝错误。触摸每个 .a 文件即可解决问题。
    • 我运行的命令略有不同:find /usr/local/go -name "*.a" -exec touch -r `which go` {} \;
    【解决方案3】:

    我认为你需要的命令是“go get”:

    go get github.com/alphazero/Go-Redis
    

    将下载 Go-Redis 库并将其放入您的 $GOPATH/src 目录中。

    go install 对您自己的源代码执行编译和安装。

    我必须承认,我在整个概念上有点挣扎,但仔细重新阅读“How to Write Go”和代码组织部分包含您需要了解的有关 go 命令如何工作的内容。

    【讨论】:

    • ... 顺便说一句:go get 应该没有 https:// 从我尝试过的。感谢您提供指向“如何编写 Go”的链接!
    • GOPATH 不是路径列表(类似于 PATH)吗?如果我没记错的话,这就是文档所说的。你确定你说的不是GOROOT?
    • GOROOT 指向 Go 二进制文件的安装位置。 GOPATH 是一个工作区列表。 golang.org/doc/code.html 有更多详细信息
    【解决方案4】:

    解决方案是从您的 .bash_profile 中删除 GOROOT。然后 go 命令会将其安装到您的 GOPATH 目录中。 奇怪的是:当我再次在我的 .bash_profile 中设置 GOROOT 并创建一个新的 shell 时,它也可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2018-01-15
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      相关资源
      最近更新 更多