【问题标题】:What should be the values of GOPATH and GOROOT?GOPATH 和 GOROOT 的值应该是什么?
【发布时间】:2011-12-19 16:49:57
【问题描述】:

我正在尝试像这样安装doozer

$ goinstall github.com/ha/doozer

我收到这些错误。

goinstall: os: go/build: package could not be found locally
goinstall: fmt: go/build: package could not be found locally
goinstall: io: go/build: package could not be found locally
goinstall: reflect: go/build: package could not be found locally
goinstall: math: go/build: package could not be found locally
goinstall: rand: go/build: package could not be found locally
goinstall: url: go/build: package could not be found locally
goinstall: net: go/build: package could not be found locally
goinstall: sync: go/build: package could not be found locally
goinstall: runtime: go/build: package could not be found locally
goinstall: strings: go/build: package could not be found locally
goinstall: sort: go/build: package could not be found locally
goinstall: strconv: go/build: package could not be found locally
goinstall: bytes: go/build: package could not be found locally
goinstall: log: go/build: package could not be found locally
goinstall: encoding/binary: go/build: package could not be found locally

【问题讨论】:

  • @Motin 上述链接已失效
  • 该文件已过时,无法用于该项目。在这里可以找到与 OSX 相关的问题:github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/841
  • 注意:默认情况下,GOPATH 将在 Go 1.8 (2017) 中为您设置。见my answer below
  • 使用 Go 1.9(2017 年第三季度),您无需再担心GOROOT。见my answer below
  • @BenyaminJafari 因为goinstall 是非常古老的 Go1 之前的版本,自 2012 年以来就不存在了。

标签: go gopath


【解决方案1】:

GOPATHGOROOT 配置已弃用。

您可以改用 GO 模块。

例如:

mkdir go_app
cd go_app
go mod init go_app

【讨论】:

  • 在大多数情况下,将模块命名为 go_app 是可以的,但更正确的是提供项目的完整路径。例如github.com/username/projectname.
  • 我认为您的意思是已弃用
【解决方案2】:

运行go help environment,它包含go env 命令可以列出的每个环境变量的文档

【讨论】:

    【解决方案3】:

    对于所有新手,如果您使用的是 Ubuntu,他们可以简单地发送 export GOPATH=$HOME/go 或发送 go help gopath 以获取更多信息。

    【讨论】:

      【解决方案4】:

      您通常不应明确设置GOROOTgo 命令根据自己的目录位置自动识别适当的GOROOT


      GOPATH 默认为$HOME/go。如果你想把它放在别的地方,你只需要明确地设置它。

      GOPATH 包含:

      如果你同时设置了GOBINGOMODCACHE,而不设置GO111MODULE=off,那么GOPATH本身应该基本上没有效果。


      此外,在旧版GOPATH 模式下(同时设置了GO111MODULE=off),GOPATH 包含:

      • 用于构建包的源代码,存储在以$GOPATH/src 为根的目录树中。
      • 使用go install 安装的非二进制文件,位于$GOPATH/pkg
        • 安装非二进制包不再特别有用:go 命令有一个cache of built artifacts,即使在GOPATH 模式下也是required since Go 1.12
        • 构建缓存位于GOPATH 内。可以使用GOCACHE 环境变量设置其位置。

      ¹ 也可以在 Go 1.17 及更早版本上使用 go get 安装二进制文件,但从 Go 1.16 开始首选 go install;见https://golang.org/doc/go1.16

      【讨论】:

        【解决方案5】:

        在现代 Go 中,您不需要设置 GOPATHGOROOT。事实上,除非您正在做一些非常专业的事情,否则最好不要在您的系统上设置它们。

        使用 Go 模块Having installed Go,选择您要工作的目录。那么:

        $ mkdir example
        $ cd example
        $ go mod init example.com
        

        注意模块名称example.com是任意的;如果您将工作保留在 GitHub 上,则可能是 github.com/your-username/project-name

        最后一个命令将创建一个go.mod 文件;现在您可以使用go get 获取依赖项:

        $ go get rsc.io/quote
        

        现在你的代码使用这个依赖:

        $ touch main.go
        

        把它放在main.go:

        package main
        
        import (
            "fmt"
        
            "rsc.io/quote"
        )
        
        func main() {
            fmt.Println(quote.Go())
        }
        

        然后运行:

        $ go run .
        

        W.r.t.原来的问题,你现在可以得到你的 doozer 依赖:

        $ go get github.com/ha/doozer
        

        现在您可以在代码中使用doozer 模块。等等。您还可以检查目录中的 go.mod 文件以查看列出的依赖项及其版本。每个模块都是自包含的,有自己的依赖版本。您可以将两个模块并排放置,每个模块都有自己的 go.mod 文件,指向某些依赖项的不同版本 - 由于模块之间的隔离,这一切都可以正常工作。

        如需了解更多信息,请以the official tutorial here 开头。在几个章节中,它会引导您完成上面显示的步骤,以及编写您自己的可重用模块和包,并从其他模块导入它们。更多互动教程可在https://play-with-go.dev/

        获得

        【讨论】:

          【解决方案6】:

          答案很多,但没有实质内容,例如机器人在其系统上的内容上进行剪切和粘贴。无需将GOROOT 设置为环境变量。但是,有一个有益需要设置GOPATH环境变量,如果不设置则默认为${HOME}/go/文件夹。

          你必须注意的是PATH环境变量,因为这个变量是可以改变你的go version的变量。不是GOROOT!忘记GOROOT

          现在,如果您切换或更改为新的go version,您下载的包将使用默认的$HOME/go 文件夹,并且它将与您之前的@​​987654330@ 混淆。这不好。

          因此,您需要在此处定义 GOPATH 以隔离新 go version 的下载包。

          总之,忘记GOROOT。更多地考虑GOPATH

          【讨论】:

            【解决方案7】:

            这是一种解决方案(单用户):

            GOROOT=$HOME/.local # your go executable is in $GOROOT/bin
            GOPATH=$HOME/.gopath
            PATH=$GOROOT/bin:$GOPATH/bin:$PATH
            

            如果您将.gopath 更改为.gogo 会抱怨。

            我希望他们能效仿rust/cargo 的做法,把所有东西都放在一个地方。

            【讨论】:

              【解决方案8】:

              值应该是(MACOS):

              GOROOT="/usr/local/go" --> all binaries file core go
              GOPATH="/Applications/proyectos/go" --> the route to workspace (custom workspace)
              

              【讨论】:

                【解决方案9】:

                截至 2020 年和 Go 版本 1.13+,在 Windows 中更新 GOPATH 的最佳方法是在命令提示符下输入:

                setx GOPATH C:\mynewgopath
                

                【讨论】:

                  【解决方案10】:

                  首次运行go env.
                  如果您看到 go 没有安装,您可以通过homebrew 或通过包和/或其他方式安装它。
                  如果您看到输出,则说明您的 Go 已安装。
                  它向您显示所有已设置和未设置的环境。

                  如果您看到 GOROOT 为空:

                  1. 运行which go(在我的电脑上:/usr/local/go/bin/go
                  2. 然后像这样导出export GOROOT=/usr/local/go

                  如果您看到 GOPATH 为空:

                  1. 在您的计算机上为 Go 项目创建任意目录:~/GO_PROJECTS
                  2. 然后export GOPATH=~/GO_PROJECTS

                  【讨论】:

                  • which go 为我做了。它使用了之前使用 Chocolatey 安装的另一个 go 安装位置。删除了该文件夹并将其从 PATH 变量中删除。现在它起作用了。谢谢!
                  • which go 命令在 Windows 7 中对我不起作用。如何找到应该在哪里运行此命令
                  • 对应的windows命令是where go会显示执行文件的路径
                  • export GOPATH=~/GO_PROJECTS 做了工作
                  • 在 WSL2 中,which go 返回 /usr/bin/go,这是一个二进制文件,而不是一个目录。不知道该怎么办。
                  【解决方案11】:

                  您无需显式设置GOROOT(现代版本的 Go 可以根据您运行的 go 二进制文件的位置自行确定)。

                  另外,在尝试使用 vgo 时出现以下错误:

                  go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
                  

                  删除 GOROOT,更新我的 GOPATH 和 export GO111MODULE="on" 解决了这个问题。

                  GOPATH 见here

                  GOPATH 可以设置为以冒号分隔的路径列表,在其中可以找到 Go 代码、包对象和可执行文件。

                  设置 GOPATH 以使用 goinstall 在 Go 树之外构建和安装您自己的代码和外部库(并避免编写 Makefile)。

                  【讨论】:

                  • 赞成正确声明无需显式设置GOROOT 环境变量。
                  【解决方案12】:

                  Go lang 安装好后,GOROOT 就是安装的根目录。

                  当我在 Windows C:\ 目录中分解 Go Lang 二进制文件时,我的 GOROOT 应该是 C:\go。 如果使用 Windows 安装程序安装,它可能是 C:\Program Files\go(或 C:\Program Files (x86)\go,对于 64 位软件包)

                   GOROOT = C:\go
                  

                  而我的 GOPATH 是 Go 语言源代码或工作区的位置。

                  如果我的 Go 语言源代码位于 C:\Users\\GO_Workspace,您的 GOPATH 将如下所示:

                   GOPATH = C:\Users\<xyz>\GO_Workspace
                  

                  【讨论】:

                    【解决方案13】:

                    还有一种情况,当我们使用 go 的时候,它会编译所有的 go 文件。

                    假设我们有一个文件 main.go,后来我们将当前文件更改为 main_old.go,然后添加了新的 main.go 文件。然后,当我们构建我们的应用程序时,所有的 go 文件都会被编译。所以发生的错误可能是由于其他一些 go 文件中的编译错误。

                    【讨论】:

                      【解决方案14】:

                      我不得不追加

                      export GOROOT=/usr/local/Cellar/go/1.10.1/libexec
                      

                      在 Mac OS X 上我的 ~/.bash_profile

                      【讨论】:

                        【解决方案15】:

                        在 osx 中,我安装了 brew,这是适合我的设置

                        GOPATH="$HOME/my_go_work_space" //make sure you have this folder created
                        
                        GOROOT="/usr/local/Cellar/go/1.10/libexec"
                        

                        【讨论】:

                          【解决方案16】:

                          具体到GOROOT,Go 1.9 会自动设置到它的安装路径。
                          即使您安装了多个 Go,调用 1.9.x 也会将 GOROOT 设置为 /path/to/go/1.9(之前,如果未设置,则假定默认路径为 /usr/local/goc:\Go)。

                          CL Go Review 53370:

                          go tool 现在将使用调用它的路径来尝试定位 Go 安装树的根目录
                          这意味着如果将整个 Go 安装移动到新位置,go tool 应该会继续照常工作。

                          这可以通过在环境中设置GOROOT 来覆盖,这只能在异常情况下进行。
                          注意这不影响runtime.GOROOT() function的结果,会继续报原安装位置;这可能会在以后的版本中修复。

                          【讨论】:

                            【解决方案17】:

                            如果你使用的是发行版,你应该指出包含文件的位置,例如:

                            $ rpm -ql golang | grep include
                            /usr/lib/golang/include
                            

                            (这是针对 Fedora 20 的)

                            【讨论】:

                              【解决方案18】:

                              从 go 1.8(2017 年第二季度)开始,GOPATH 将默认设置为 $HOME/go

                              参见issue 17262 和 Rob Pike 的评论:

                              $HOME/go 会的。
                              没有单一的最佳答案,但这是简短而甜蜜的,如果$HOME/go 已经存在,选择该名称只会是一个问题,这只会让已经安装并理解GOPATH 的专家感到高兴。

                              【讨论】:

                              • 这么简单的话题怎么会变得这么复杂!感谢您在这里提供最佳答案。
                              • @dodgy_coder 实际上......看看我的另一个答案的前两行:stackoverflow.com/a/37905102/6309 ;) 这可能会更简单:根本没有 GOPATH!更多详情stackoverflow.com/a/48914523/6309
                              • 是的,我同意,如果您使用默认值,则不需要 GOPATH,对吗?由于 Google App Engine(Go 标准)开发环境需要它,我无论如何都需要设置它。他们实际上告诉您设置 GOPATH,但没有告诉您将其设置为什么值..!
                              • @dodgy_coder 是的,默认情况下,Go 会在一个固定的预定值中寻找项目 PATH。
                              【解决方案19】:

                              GOPATH讨论in the cmd/go documentation

                              GOPATH 环境变量列出了查找 Go 代码的位置。在 Unix,值是一个冒号分隔的字符串。在 Windows 上,该值为 分号分隔的字符串。在计划 9 中,值是一个列表。

                              GOPATH 必须设置为在 标准 Go 树。

                              GOROOTthe installation instructions 中讨论:

                              Go 二进制发行版假定它们将安装在 /usr/local/go(或Windows下c:\Go),但可以安装 转到其他位置的工具。在这种情况下,您必须设置 GOROOT 环境变量指向它所在的目录 已安装。

                              例如,如果您安装了 Go 到您的主目录,您应该添加 将以下命令发送到$HOME/.profile

                              export GOROOT=$HOME/go
                              export PATH=$PATH:$GOROOT/bin
                              

                              注意: GOROOT 必须仅在安装到自定义位置时设置。

                              Chris Bunch's answer的更新版本。)

                              【讨论】:

                              • 关于 GOPATH 的更全面的信息位于 How to Write Go Code. 掌握理解 go 命令所需的信息,这对于使用 Go 至关重要。例如,在 OP 中使用 goinstall 现在应该是 go get
                              • 还要注意go的实际安装路径。例如,在默认的 homebrew 设置中,homebrew 将在 /usr/local/Cellar/go/ 中安装 go。在这种情况下,导出路径应设置为export GOROOT=/usr/local/Cellar/go/{version}export PATH=$PATH:$GOROOT/bin
                              • 我必须通过 export GOROOT=/usr/local/Cellar/go/1.2/libexec/ 让我的 brew 使用。
                              • 我无法建议此编辑,因为该应用程序抱怨我的编辑“似乎包含”未格式化的代码(它没有;非常感谢)但是:
                              • 从 Go 1.10 开始,如果 GOROOT 未设置,go 工具将尝试通过自己的位置来计算它。我也无法粘贴链接,因为粘贴在 Stack Exchange 的 iOS 应用程序中不起作用。现在很沮丧。
                              【解决方案20】:

                              GOPATH 应该指向 Go 安装,而是指向您的工作区(请参阅 https://golang.org/doc/code.html#GOPATH)。每当您使用 go get 或 go install 安装某些软件包时,它都会落在 GOPATH 中。这就是它警告您的原因,您绝对希望将来自互联网的随机包转储到您的官方安装中。

                              【讨论】:

                                【解决方案21】:

                                这是我的简单设置:

                                directory for go related things: ~/programming/go
                                directory for go compiler/tools: ~/programming/go/go-1.4
                                directory for go software      : ~/programming/go/packages
                                

                                GOROOT、GOPATH、PATH设置如下:

                                export GOROOT=/home/user/programming/go/go-1.4
                                export GOPATH=/home/user/programming/go/packages
                                export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
                                

                                所以,简而言之:

                                GOROOT 适用于来自 go 安装的编译器/工具。
                                GOPATH 用于您自己的 go 项目/第 3 方库(使用“go get”下载)。

                                【讨论】:

                                • 我认为这个答案更容易理解,因为有一个针对文件夹结构的映射。
                                • GOPATH 是否包含带有非 go 文件的整个项目树(例如 git)?图像、脚本、构建文件等?
                                • 你能提供你的安装墙吗?我假设您使用 wget 下载 tar 文件并稍后解压缩?
                                【解决方案22】:

                                如上所述:

                                GOPATH 环境变量指定您的位置 工作区。

                                对于 Windows,这对我有用(在 Ms-dos 窗口中):

                                set GOPATH=D:\my_folder_for_go_code\
                                

                                这会创建一个 GOPATH 变量,Ms-dos 在使用时可以识别如下:

                                cd %GOPATH%
                                

                                【讨论】:

                                  【解决方案23】:

                                  我阅读了 go help gopath 文档,仍然非常困惑,但从另一个 go doc 页面找到了这个小块:

                                  GOPATH 环境变量指定工作区的位置。它可能是您在开发 Go 代码时需要设置的唯一环境变量。

                                  http://golang.org/doc/code.html#GOPATH

                                  【讨论】:

                                    【解决方案24】:

                                    GOPATH 正在讨论here

                                    GOPATH 环境变量

                                    GOPATH 可以设置为以冒号分隔的路径列表,其中 Go 可以找到代码、包对象和可执行文件。

                                    设置GOPATH 以使用 goinstall 构建和安装您自己的代码和 Go 树之外的外部库(并避免编写 生成文件)。

                                    GOROOT讨论here

                                    $GOROOT Go 树的根,通常是$HOME/go。这默认为 运行all.bash 的目录的父级。如果你选择不 设置$GOROOT,你必须运行 gomake 而不是 make 或 gmake 时 使用传统的 makefile 开发 Go 程序。

                                    【讨论】:

                                    • 所以如果我已经安装在 ~/projects/go 中,该变量的值应该是什么来查找 os、fmt 等?
                                    • 那么当你 sudo apt-get install golang 时,Go 安装在哪里?
                                    • @weberc2 如果您运行go env,您应该会看到该信息,对我来说是/usr/lib/go/
                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2017-09-21
                                    • 2016-07-17
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多