什么应该是GOPATH和GOROOT的价值观?

时间:2011-11-01 17:32:52

标签: go

我正在尝试像这样安装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

23 个答案:

答案 0 :(得分:243)

讨论了{p> GOPATH in the cmd/go documentation

  

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

     必须设置

GOPATH以获取,构建和安装包之外的包   标准的Go树。

the installation instructions中讨论了

GOROOT

  

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

     

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

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

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

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

答案 1 :(得分:89)

这是一个简单的设置:

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适用于来自安装的编译器/工具 GOPATH适用于您自己的项目/第三方图书馆(使用&#34下载; go get")。

答案 2 :(得分:39)

首先运行go env 如果您发现安装了该产品,您可以通过自制软件或通过包装和/或其他方式进行安装。
如果你看到输出,那么就安装了你的go 它会显示所有已设置且未设置的环境。

如果您看到空GOROOT

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

    如果您看到空GOPATH

    1. 在您的计算机上的任意位置创建任何目录,以便在我的案例中执行项目:~/GO_PROJECTS
    2. 然后export GOPATH=~/GO_PROJECTS

答案 3 :(得分:38)

讨论了{p> GOPATH here

  

GOPATH环境变量

     

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

     

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

GOROOT讨论here

  

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

答案 4 :(得分:15)

我阅读了go help gopath文档并且仍然令人难以置信地困惑,但是从另一个go doc页面找到了这个小块:

  

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

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

答案 5 :(得分:10)

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

答案 6 :(得分:8)

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

请参阅issue 17262和Rob Pike的评论:

  

$HOME/go它会   没有单一的最佳答案,但这很简短,如果$HOME/go已经存在,选择该名称只会是一个问题,这对于已经安装并且会理解{{1 }}

答案 7 :(得分:7)

如上所述:

  

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

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

set GOPATH=D:\my_folder_for_go_code\

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

cd %GOPATH%

答案 8 :(得分:3)

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

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

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

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

总而言之,忘记GOROOT。多考虑GOPATH

答案 9 :(得分:2)

特别针对GOROOT,Go 1.9会自动将其设置为其安装路径 即使您安装了多个Go,调用1.9.x也会将GOROOT设置为/path/to/go/1.9(之前,如果未设置,则会假设默认路径为/usr/local/go或{{1} })。

请参阅CL Go Review 53370

  

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

     

这可以通过在环境中设置go tool来覆盖,这只应在特殊情况下进行   请注意,这不会影响runtime.GOROOT() function的结果,{{3}}将继续报告原始安装位置;这可能会在以后的版本中修复。

答案 10 :(得分:1)

在现代 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/

获得

答案 11 :(得分:1)

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

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

go抱怨将.gopath更改为.go

我希望他们与rust/cargo的家伙一起做,并把所有东西都放在一个地方。

答案 12 :(得分:0)

运行 go help environment 它有关于可以通过 go env 命令列出的每个环境变量的文档

答案 13 :(得分:0)

您通常不应显式设置 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

答案 14 :(得分:0)

从2020年和Go 1.13版开始,在Windows中,更新GOPATH的最佳方法是在命令提示符下键入:

setx GOPATH C:\mynewgopath

答案 15 :(得分:0)

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

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

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

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

GOPATH参见outerHTML

  

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

     

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

答案 16 :(得分:0)

一旦安装了Go lang,GOROOT就是安装的根目录。

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

 GOROOT = C:\go

我的GOPATH是Go lang源代码或工作区的位置。

如果我的Go lang源代码位于C:\ Users \\ GO_Workspace,则您的GOPATH如下:

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

答案 17 :(得分:0)

在某些情况下,当我们使用go时,它会编译所有go文件。

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

答案 18 :(得分:0)

我不得不追加

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

到Mac OS X上的〜/ .bash_profile

答案 19 :(得分:0)

在osx中​​,我使用brew安装,这是适用于我的设置

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

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

答案 20 :(得分:-1)

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

答案 21 :(得分:-3)

值应为(MACOS):

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

答案 22 :(得分:-3)

如果您使用的是发行版,则应指向包含文件的位置,例如:

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

(这适用于Fedora 20)