你不再用设置 GOROOT 了

为何再也不须要设置 GOROOT 呢?推荐读两篇英文文章,我意译了下,将它们放在了一篇里。golang

第一篇是关于 Go 1.10 以前,怎么设置 GOROOT,发表与 2013 年。第二篇是从 Go 1.10 开始,如何处理 GOROOT,时间是 2018 年,Go 源码提交日志。这篇很是短小。bash

读完后,你会发现,大多数状况下,咱们都不用手动设置 GOROOT 了。架构

第一篇

做者:Dave Cheney | 地址:you-dont-need-to-set-goroot-really函数

一篇小短文,解释了为何在编译和使用 Go 时,不须要设置 GOROOT工具

概要性介绍

通常来讲,在 Go 1.0 以后,编译和使用 GO 再也不须要设置 GOROOT。事实上,若是你的电脑上存在多个版本的 Go 语言环境,设置 GOROOT 可能产生一些问题。ui

GOPATH 仍然须要设置。google

从 Go 1.0 开始,GOPATH 就被强烈推荐。随着 Go 1.1 的发布,GOPATH 已是强制性的了。spa

为何再也不要设置 GOROOT

谈些 Go 环境变量的历史吧!.net

Go 的资深老前辈们可能还记得,曾经的 Go 不只要设置 GOROOT,还须要设置 GOOSGOARCH。之因此要设置 GOROOT,是由于 Make 在编译构建的时候,引入了 GOROOT 中的内容,要提早设置 GOROOT 做为了它们的基本路径。翻译

随着 go tool 的引入,Go 1.0 以前,GOOSGOARCH 已经变成可选了,由于构建脚本已经能自动检测出系统类别和 CPU 架构。在 Go 1.0 的发布后,引入了 cmd/dist 引导构建工具,GOOSGOARCH 真正意义上是可选项了,仅仅在交叉编译时才会用到。

不须要设置 GOOSGOARCH,那 GOROOT 呢?

GOROOT 定义为指定安装 GO 的根目录。在以前的 Makefile 中,引入其余 Makefile 时,将它做为基础路径。并且,Go 1.0 以后,go tool 利用它查找 Go 编译器(保存在 $GOROOT/pkg/tool/$GOOS_$GOARCH)和标准库(在 $GOROOT/pkg/$GOOS_$GOARCH)。若是你是一名 Java 开发者,能够将 GOROOT 理解为 JAVA_HOME

源码编译 Go,GOROOT 将自动发现(all.bash 的上级目录),而后设置到 go 工具链。

以下命令查看:

$ echo $GOROOT

$ go env
/home/dfc/go
复制代码

从 golang.org 下载的二进制包或者系统方式安装的 Go 环境,也已在工具链中设置了正确的 GOROOT。

一个例子,好比 Ubutun 12.04 下,安装了 Go 1.0。

$ dpkg -l golang-{go,src} | grep ^ii
$ go
/usr/bin/go
$ go env GOROOT
/usr/lib/go
复制代码

咱们能够看出,Go 工具链被安装在了 /usr/bin/go 下,GOROOT 内置为 /usr/lib/go

为何不该该设置 GOROOT

咱们不该该设置 GOROOT,是由于 Go 工具链已经内置了正确的值。

设置 GOROOT 将会覆盖掉保存在 go 工具链中的默认值,可能会致使 go 执行不一样版本的编译器和标准库文件。

两种状况下,你须要设置 GOROOT。在官方的 安装介绍 有相关的描述。

  • 若是你是 Linux、FreeBSD 或者 OS X 用户,下载了 zip 和 tarball 的二进制包安装环境。这些二进制的默认环境位于 /usr/local/go,建议你将 Go 安装到这个位置。若是选择不这么作,就必须设置到你指定的目录下。
  • 若是你是 Windows 用户,使用 zip 二进制包安装,默认的 GOROOT 在 C:\Go 目录下。若是你将 Go 安装在其余位置,请设置 GOROOT 到指定的目录。

其余细节

本文已经介绍了当经过源码编译 Go 环境的时候,GOROOT 如何自动发现的。但若是 GOROOT 与 all.bash 所在位置并不匹配呢?好比,在临时目录下编译 Go 环境,如何正确地设置 GOROOT 呢?答案是使用 GOROOT_FINAL,它将被用于覆盖自动发现的 GOROOT,设置到 GO 工具链中。

举个例子,在 Debian/Ubuntu 上,构建程序会将 GOROOT_FINAL 的值设置为 /usr/lib/go。保持 GOROOT 是未设置状态,使构建编译愉快地执行。构建完成后,将 Go 工具链安装到 /usr/bin 目录下,编译器、源码和包安装到 /usr/lib/go 下。

注意点

若是使用二进制包安装 Go 环境,有些特殊状况须要处理,本文已经做了相关描述。

虽然构建系统能自动检测,但若是 all.bash 的父级目录不知足 GOROOT 要求,也须要另外处理。

第二篇

翻译自 Go 的提交日志,地址:use os.Executable to find GOROOT

Go 1.10 开始,经过 use os.Executable 查找 GOROOT

以前,咱们是经过 make.sh 编译构建 GOROOT,但若是将整个目录移动到新的路径下,这会使 Go 工具链没法正常工做。

如何解决这个问题呢?

一是能够将源码从新编译,但若是新位置在其余用户的目录下,可能就没法这么操做了。

二是,经过设置 GOROOT 环境变量的方式解决,但另外设置 GOROOT 是不推荐的,由于它可能使一个环境下 go tool 使用了另外一个环境下 compile

此次的修改,go tool 将经过相对路径的方式肯定 GOROOT,经过使用 os.Execute 函数。同时,还会检查 $GOROOT/pkg/tool 目录是否存在,以免下面的两种状况。

$ ln -s $GOROOT/bin/go /usr/local/bin/go
复制代码

$ PATH=$HOME/bin:$PATH
$ GOPATH=$HOME
$ ln -s $GOROOT/bin/go $HOME/bin/go
复制代码

另外,若是当前的执行路径并不在 GOROOT 下,将会经过软链接找到真正的命令的位置,检查这个路径是不是 GOROOT


相关文章
相关标签/搜索