我的Debian是用來工作的,因此用的是穩(wěn)定源烘嘱。穩(wěn)定源的優(yōu)點是昆禽,軟件經過充分的測試,處于穩(wěn)定版本蝇庭。這種狀態(tài)對于絕大多數(shù)軟件醉鳖,都是最合適的。
但是哮内,對于一些需要最新版本的軟件來說盗棵,穩(wěn)定源太過于滯后。
目前(2016),Debian的穩(wěn)定源只能安裝go1.3版本琳拨。如果需要最新的版本辐怕,只能自行從源碼編譯安裝。
卸載舊版本
sudo apt-get remove golang
sudo apt-get autoremove
源碼下載
git clone https://github.com/golang/go.git
如果沒有Git从绘,必須自行解決寄疏;如果沒有gcc是牢,也需要自行安裝。
此外陕截,golang/go這個庫實在太大驳棱,近200MB。完整從GitHub上拉下來农曲,非常耗時社搅;在GitHub連接不穩(wěn)定時,也可能會失敗乳规。這屬于網絡問題形葬,讀者也需自行解決。
按時間順序暮的,這里記錄了一些相關的坑笙以。如果想直接按照正確的步驟完成編譯,可以跳到環(huán)境配置小節(jié)冻辩。
首次編譯錯誤
Go不支持在根目錄下編譯猖腕,必須到src
目錄去。
$ cd src
$ ./all.bash
##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find ~/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
我本來就是因為只有Go1.3恨闪,才要從源碼安裝新版本的√雀校現(xiàn)在找我要Go1.4,這可如何是好咙咽?
自舉
Go從1.5版本開始實現(xiàn)“自舉”(Bootstrap)老玛,也就是用Go來實現(xiàn)Go、用Go來編譯Go钧敞。之前都是用C來實現(xiàn)逻炊,編譯Go項目就是編譯C語言。
因此犁享,只要把源碼checkout到1.4版本余素,就可以不需要依賴于Go自身,解決自我依賴悖論炊昆。
git checkout go1.4
./all.bash
二次編譯錯誤:import cycle not allowed
import cycle not allowed
package ./cmd/dist
imports bytes
imports errors
imports runtime
imports runtime/internal/atomic
imports runtime
Go不支持循環(huán)導入桨吊,不知算進步還是退步。
不過凤巨,這里倒是體現(xiàn)了價值视乐,提前報錯。這個錯誤的主要原因敢茁,是編譯時把GOROOT下的源碼與GOROOT_BOOTSTRAP下的搞混了佑淀。如果Go與Java一樣支持循環(huán)導入,那么這里就會進行一次錯誤的編譯彰檬。
這個問題大致是路徑配置錯誤導致的伸刃。未免誤導谎砾,這里就不詳述復現(xiàn)步驟了。
總之捧颅,先配置好GO的環(huán)境路徑景图,能解決大多數(shù)錯誤。
環(huán)境配置
為了避免go1.4
這個目錄混雜在我本就已經混亂不堪的$HOME
目錄碉哑,我新建一個隱藏目錄.golang
挚币,作為Go的相關環(huán)境配置的位置。
把以下配置加入shell的配置文件扣典,bash是~/bashrc
妆毕。
export GOROOT=$HOME/.golang/go
export GOPATH=$HOME/.golang/path
export GOROOT_BOOTSTRAP=$HOME/.golang/go1.4
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
- GOROOT是源碼與可執(zhí)行文件的位置。
- GOPATH是放置Go的第三方安裝包的位置贮尖。(編譯過程中并未使用笛粘。)
- GOROOT_BOOTSTRAP是用來自舉的Go目錄,是1.4版本远舅。
-
export PATH=*
是添加編譯好的Go、以及以后通過go get
安裝的第三方庫痕钢,進入可執(zhí)行環(huán)境图柏。這句,老鳥應該都很熟任连。
由于GOROOT目錄下蚤吹,只有go
和gofmt
兩個可執(zhí)行文件,所以也可以用軟鏈接來配置随抠。
注意:這里出現(xiàn)了go
和go1.4
兩個目錄裁着,它們本質上是相同的。為避免clone兩遍拱她,可以直接本地復制二驰。
cp -r go go1.4
正確的編譯步驟
- 先進入
GOROOT_BOOTSTRAP/src
,執(zhí)行git checkout go1.4.3
秉沼,切換到1.4.3版本桶雀。 - 執(zhí)行
./make.bash
。
一般教程(比如本文前面首次編譯錯誤小節(jié))是用./all.bash
唬复,其實沒必要矗积。./all.bash
是編譯并測試,而./make.bash
只是編譯敞咧。前者大約5分鐘棘捣,后者大約2分鐘。對我們這種Go語言的使用者而非開發(fā)者來說休建,顯然后者就夠了乍恐。 - 進入
GOROOT
目錄评疗,執(zhí)行./make.bash
。
結束后禁熏,可以檢查版本壤巷。
$ go version
go version devel +f8187ce Mon Nov 7 02:55:52 2016 +0000 linux/amd64
咦?怎么版本怪怪的瞧毙!
這是因為master的HEAD胧华,通常是一個開發(fā)中的提交,是最新不穩(wěn)定版本宙彪。
如果想要穩(wěn)定版怎么辦矩动?
和編譯1.4.3版本類似,checkout過去再編譯释漆。比如悲没,我現(xiàn)在是1.7.3版本。
$ git checkout go1.7.3
...
$ ./make.bash
...
$ go version
go version go1.7.3 linux/amd64
感覺好多了男图。