天天看點

Debian下編譯安裝Golang

我的Debian是用來工作的,是以用的是穩定源。穩定源的優點是,軟體經過充分的測試,處于穩定版本。這種狀态對于絕大多數軟體,都是最合适的。

但是,對于一些需要最新版本的軟體來說,穩定源太過于滞後。

官網不僅連接配接不穩定,二進制釋出包也不夠全。

目前(2016),Debian的穩定源隻能安裝go1.3版本。如果需要最新的版本,隻能自行從源碼編譯安裝。

如果沒有Git,必須自行解決;如果沒有gcc,也需要自行安裝。

按時間順序,這裡記錄了一些相關的坑。如果想直接按照正确的步驟完成編譯,可以跳到環境配置小節。

Go不支援在根目錄下編譯,必須到<code>src</code>目錄去。

我本來就是因為隻有Go1.3,才要從源碼安裝新版本的。現在找我要Go1.4,這可如何是好?

Go從1.5版本開始實作“自舉”(Bootstrap),也就是用Go來實作Go、用Go來編譯Go。之前都是用C來實作,編譯Go項目就是編譯C語言。

是以,隻要把源碼checkout到1.4版本,就可以不需要依賴于Go自身,解決自我依賴悖論。

Go不支援循環導入,不知算進步還是退步。

不過,這裡倒是展現了價值,提前報錯。這個錯誤的主要原因,是編譯時把GOROOT下的源碼與GOROOT_BOOTSTRAP下的搞混了。如果Go與Java一樣支援循環導入,那麼這裡就會進行一次錯誤的編譯。

這個問題大緻是路徑配置錯誤導緻的。未免誤導,這裡就不詳述複現步驟了。

總之,先配置好GO的環境路徑,能解決大多數錯誤。

為了避免<code>go1.4</code>這個目錄混雜在我本就已經混亂不堪的<code>$HOME</code>目錄,我建立一個隐藏目錄<code>.golang</code>,作為Go的相關環境配置的位置。

把以下配置加入shell的配置檔案,bash是<code>~/bashrc</code>。

GOROOT是源碼與可執行檔案的位置。

GOPATH是放置Go的第三方安裝包的位置。(編譯過程中并未使用。)

GOROOT_BOOTSTRAP是用來自舉的Go目錄,是1.4版本。

<code>export PATH=*</code>是添加編譯好的Go、以及以後通過<code>go get</code>安裝的第三方庫,進入可執行環境。這句,老鳥應該都很熟。

由于GOROOT目錄下,隻有<code>go</code>和<code>gofmt</code>兩個可執行檔案,是以也可以用軟連結來配置。

注意:這裡出現了<code>go</code>和<code>go1.4</code>兩個目錄,它們本質上是相同的。為避免clone兩遍,可以直接本地複制。

先進入<code>GOROOT_BOOTSTRAP/src</code>,執行<code>git checkout go1.4.3</code>,切換到1.4.3版本。

執行<code>./make.bash</code>。

一般教程(比如本文前面首次編譯錯誤小節)是用<code>./all.bash</code>,其實沒必要。<code>./all.bash</code>是編譯并測試,而<code>./make.bash</code>隻是編譯。前者大約5分鐘,後者大約2分鐘。對我們這種Go語言的使用者而非開發者來說,顯然後者就夠了。

進入<code>GOROOT</code>目錄,執行<code>./make.bash</code>。

結束後,可以檢查版本。

咦?怎麼版本怪怪的!

這是因為master的HEAD,通常是一個開發中的送出,是最新不穩定版本。

如果想要穩定版怎麼辦?

和編譯1.4.3版本類似,checkout過去再編譯。比如,我現在是1.7.3版本。

感覺好多了。

文/匿蟒(簡書作者)

原文釋出時間:2016-11-23