爲何再也不須要設置 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
,還須要設置 GOOS
和 GOARCH
。之因此要設置 GOROOT
,是由於 Make 在編譯構建的時候,引入了 GOROOT
中的內容,要提早設置 GOROOT
做爲了它們的基本路徑。翻譯
隨着 go tool
的引入,Go 1.0 以前,GOOS
和 GOARCH
已經變成可選了,由於構建腳本已經能自動檢測出系統類別和 CPU 架構。在 Go 1.0 的發佈後,引入了 cmd/dist 引導構建工具,GOOS
和 GOARCH
真正意義上是可選項了,僅僅在交叉編譯時纔會用到。
不須要設置 GOOS
和 GOARCH
,那 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
。在官方的 安裝介紹 有相關的描述。
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
。