GOPATH和GOROOT的值应该是什么?

我试图像这样安装非常出色的人:

$ 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
531359 次浏览

GOPATH讨论在这里:

GOPATH环境变量

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

设置GOPATH来使用goinstall来构建和安装您自己的代码和 Go树之外的外部库(并避免写入 makefile)。< / p >

GOROOT讨论在这里:

$GOROOT Go树的根,通常是$HOME/go。默认为 all.bash所在目录的父目录。如果你选择不去的话 set $GOROOT时,你必须运行gomake而不是make或gmake

.使用传统的makefile开发Go程序

GOPATH讨论cmd/go文档中:

GOPATH环境变量列出了寻找Go代码的位置。在 Unix,值是一个冒号分隔的字符串。Windows操作系统为 以分号分隔的字符串。在Plan 9中,取值为列表

GOPATH必须设置为获取、构建和安装包

GOROOT安装说明中讨论:

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

例如,如果你安装了Go到你的主目录,你应该添加 以下命令$HOME/.profile: < / p >

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

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

(克里斯·邦奇的回答的更新版本。)

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

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

< a href = " http://golang.org/doc/code.html GOPATH " > http://golang.org/doc/code.html GOPATH < / >

如上所述:

GOPATH环境变量指定您的 工作区。< / p >

对于Windows,这为我工作(在Ms-dos窗口):

set GOPATH=D:\my_folder_for_go_code\

这将创建一个Ms-dos识别的GOPATH变量,使用如下:

cd %GOPATH%

以下是我的简单设置:

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 get”)

如果你正在使用发行版go,你应该指向包含文件的位置,例如:

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

(这是针对Fedora 20)

GOPATH应该指向Go安装,而不是指向你的工作空间(参见https://golang.org/doc/code.html#GOPATH)。当你使用go get或go install安装某个包时,它会落在GOPATH中。这就是为什么它警告你,你肯定想从互联网随机包被转储到你的正式安装。

首先运行go env 如果你看到go没有安装,你可以通过homebrew或通过package和/或其他方式安装它 如果你看到输出,那么你的Go已经安装了 它会显示所有已设置和未设置的env

如果你看到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

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

参见发行17262和Rob Pike的评论:

$HOME/go它将是。
没有唯一的最佳答案,但这是简短而甜蜜的,只有在$HOME/go已经存在的情况下,选择这个名称才会成为一个问题,这只会发生在已经安装并理解GOPATH的专家身上

对于GOROOT, Go 1.9会自动将其设置到其安装路径 即使你安装了多个Go,调用1.9。xone将GOROOT设置为/path/to/go/1.9(之前,如果没有设置,它会假设一个默认路径,如/usr/local/goc:\Go)

看到CL Go Review 53370:

< p > go tool现在将使用调用它的路径来尝试定位Go安装树的根。< br > 这意味着如果整个Go安装被移动到一个新的位置,go tool应该继续像往常一样工作

这可以通过在环境中设置GOROOT来覆盖,这只应该在不寻常的情况下执行 注意,这不会影响runtime.GOROOT()函数的结果,它将继续报告原始安装位置;这可能会在以后的版本中修复

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

GOPATH="$HOME/my_go_work_space" //make sure you have this folder created


GOROOT="/usr/local/Cellar/go/1.10/libexec"

我不得不追加

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

到Mac OS X上的~ / . bash_profile

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

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

安装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 lang源代码或工作区的位置。

如果我的Go lang源代码位于C:\Users\\GO_Workspace,那么你的GOPATH将如下所示:

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

你不需要显式地设置GOROOT(现代版本的Go可以根据你运行的Go二进制文件的位置自己找出它)。

另外,在尝试使用vgo时得到了跟随错误:

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

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

在这里中看到GOPATH

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

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

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

setx GOPATH C:\mynewgopath

值应该是(MACOS):

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

这里有一个解决方案(单用户):

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

如果你将.gopath改为.gogo会报错。

我希望他们能像rust/cargo那样,把所有东西都放在一个地方。

答案很多,但没有实质内容,就像机器人对系统中的内容进行剪切和粘贴。没有必要将GOROOT设置为环境变量。然而,有一个有益的需要设置GOPATH环境变量,如果没有设置它默认为${HOME}/go/文件夹。

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

现在,如果你切换或更改为一个新的go version,你下载的包将使用默认的$HOME/go文件夹,它将与你之前的go version文件夹混合。这可不太好。

因此,这就是你需要定义GOPATH的地方,以便隔离新go version的下载包。

总之,忘记GOROOT吧。想想GOPATH

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

使用Go模块安装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文件指向某个依赖项的不同版本——这一切都可以正常工作,因为模块之间是隔离的。

有关更多信息,请从官方教程在这里开始。在几个章节中,它将引导您完成上述步骤,以及编写自己的可重用模块和包,并从其他模块导入它们。额外的交互式教程可以在https://play-with-go.dev/中找到

通常不应该显式地设置GOROOTgo命令根据自己的目录位置自动识别适当的GOROOT


GOPATH默认为$HOME/go。只有当你想把它放在其他地方时,你才需要显式地设置它。

GOPATH包含:

  • 使用go install安装的二进制文件,位于$GOPATH/bin
    • 这个位置可以使用GOBIN环境变量来覆盖。
  • A 下载的模块源代码和校验和的缓存,位于$GOPATH/pkg/mod
    • 这个位置可以使用GOMODCACHE环境变量来覆盖。

如果你同时设置了GOBINGOMODCACHE,而没有设置GO111MODULE=off,那么GOPATH本身基本上没有任何影响。


此外,在遗留的GOPATH模式中(当GO111MODULE=off也被设置时),GOPATH包含:

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

¹二进制文件也可以在Go 1.17及更早版本上使用go get安装,但在Go 1.16之前优先使用go install;看到https://golang.org/doc/go1.16

对于所有的新手,如果你使用Ubuntu,他们可以做一个简单的export GOPATH=$HOME/go,或者做go help gopath以获取更多信息。

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

GOPATHGOROOT配置已弃用。

您可以使用GO模块。

例如:

mkdir go_app
cd go_app
go mod init go_app

你可以使用一个命令:go env GOPATH