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

jsh*_*hen 296 go gopath

我正在尝试像这样安装doozer

$ goinstall github.com/ha/doozer
Run Code Online (Sandbox Code Playgroud)

我收到这些错误.

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
Run Code Online (Sandbox Code Playgroud)

pje*_*pje 284

GOPATHcmd/go文档中讨论:

GOPATH环境变量列表地方寻找Go代码.在Unix上,该值是以冒号分隔的字符串.在Windows上,该值是以分号分隔的字符串.在计划9中,值是一个列表.

GOPATH 必须设置为在标准Go树之外获取,构建和安装包.

GOROOT安装说明中讨论:

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

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

export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
Run Code Online (Sandbox Code Playgroud)

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

(Chris Bunch的答案的更新版本.)

  • 关于GOPATH的更全面的信息在[如何编写Go代码.](http://golang.org/doc/code.html)掌握了解`go`命令所需的信息,这是必不可少的与Go一起工作.例如,在OP中使用`goinstall`现在应该是`go get`. (41认同)
  • 另请注意go的实际安装路径.例如,在默认的自制软件设置中,自制软件将安装在`/ usr/local/Cellar/go /`中.在这种情况下,导出路径应该设置为`export GOROOT =/usr/local/Cellar/go/{version}`和`export PATH = $ PATH:$ GOROOT/bin`. (11认同)
  • 我不得不做`export GOROOT =/usr/local/Cellar/go/1.2/libexec /`让我的工作与酿造. (8认同)

Evg*_*M86 92

这是一个简单的设置:

directory for go related things: ~/programming/go
directory for go compiler/tools: ~/programming/go/go-1.4
directory for go software      : ~/programming/go/packages
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

简而言之:

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

  • 我认为这个答案更容易理解,因为存在针对文件夹结构的映射。 (3认同)

РАВ*_*АВИ 44

第一次运行go env.
如果你看到没有安装,你可以通过自制软件或通过包和/或其他方式安装它.
如果您看到输出,则安装go.
它显示了所有已设置但未设置的环境.

如果你看到空的homebrew:

  1. 运行Go(在我的电脑:GOROOT)
  2. 然后像这样出口 which go

如果你看到空的/usr/local/go/bin/go:

  1. 在我的案例中,在计算机的任何位置创建任何目录以进行项目: export GOROOT=/usr/local/go
  2. 然后 GOPATH

  • `哪个'为我做了.它使用的是使用Chocolatey的先前安装中的另一个安装位置.删除该文件夹并将其从PATH变量中删除.现在它有效.谢谢! (2认同)
  • 对应的windows命令是“where go”,它会显示执行文件的路径 (2认同)

Chr*_*nch 39

GOPATH这里讨论:

GOPATH环境变量

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

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

GOROOT讨论在这里:

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

  • @weberc2如果你运行`go env`你应该看到那些信息,对我来说它是`/ usr/lib/go /` (8认同)
  • 那么,当您`sudo apt-get install golang`时,Go会安装在哪里? (2认同)

Max*_*Max 18

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

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

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


bcm*_*lls 15

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

\n
\n

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

\n

GOPATH包含:

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

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

\n
\n

另外,在遗留GOPATH模式下(GO111MODULE=off也设置时),GOPATH包含:

\n
    \n
  • 用于构建包的源代码,存储在以$GOPATH/src.
  • \n
  • 使用 安装的非二进制文件go install,位于$GOPATH/pkg。\n
      \n
    • 安装非二进制包不再特别有用:该go命令具有内置工件的缓存从 Go 1.12 开始,即使在GOPATH模式下也需要它。
    • \n
    • 构建缓存位于GOPATH. 它的位置可以通过环境变量来设置GOCACHE
    • \n
    \n
  • \n
\n
\n

\xc2\xb9 二进制文件也可以在 Go 1.17 及更早版本上安装go get,但从go installGo 1.16 开始首选;请参阅https://golang.org/doc/go1.16

\n


arg*_*eng 11

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


Von*_*onC 9

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

参见问题17262和Rob Pike的评论:

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


Von*_*onC 9

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

请参阅CL Go 评论 53370

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

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


Eli*_*sky 8

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

使用 Go 模块安装 Go 后,选择您想要工作的目录。然后:

$ mkdir example
$ cd example
$ go mod init example.com
Run Code Online (Sandbox Code Playgroud)

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

最后一条命令将创建一个go.mod文件;现在你可以通过以下方式获取依赖项go get

$ go get rsc.io/quote
Run Code Online (Sandbox Code Playgroud)

现在您的代码使用此依赖项:

$ touch main.go
Run Code Online (Sandbox Code Playgroud)

将其放入main.go

package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Go())
}
Run Code Online (Sandbox Code Playgroud)

并运行:

$ go run .
Run Code Online (Sandbox Code Playgroud)

关于原始问题,您现在可以doozer通过以下方式获取依赖项:

$ go get github.com/ha/doozer
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

GOPATH并且GOROOT配置已被弃用。

您可以改用 GO 模块。

例如:

mkdir go_app
cd go_app
go mod init go_app
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的意思是**已弃用**。 (2认同)
  • @thanos.a 在这种情况下是可以的,但是包的名称不能覆盖标准 go 模块的名称。使用完整路径可以更轻松地避免此类情况。 (2认同)

tuc*_*son 6

正如刚才提到的:

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

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

set GOPATH=D:\my_folder_for_go_code\
Run Code Online (Sandbox Code Playgroud)

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

cd %GOPATH%
Run Code Online (Sandbox Code Playgroud)


typ*_*gic 5

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

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

现在,如果您切换或更改为新的go version,您下载的软件包将使用默认$HOME/go文件夹,并且它将与您以前的文件夹混合在一起go version。不是很好。

因此,您需要在此处GOPATH进行定义,以便隔离下载的新go version.

总而言之,忘记了GOROOT。多思考一下GOPATH