你不再用設置 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


相關文章
相關標籤/搜索