這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go語言目前(截至1.0.2版本)尚不支援直接連結.a檔案(這裡的.a檔案指的不是傳統靜態共用庫,而是對golang的非main包build後的產物)。這樣一來Go的第三方庫包或組織內部的公用程式碼程式庫包只能以源碼的形式分發了。
Go提供了get命令用於擷取他人分發的程式碼封裝。我們通過get命令既可以擷取一些知名代碼託管網站上的代碼,也可以擷取組織組建控制伺服器上的公用代碼。
Go get支援的託管網站包括github、google code、BitBucket以及Launchpad,針對這類情況,我們可以得到“特殊”文法的照顧:
go get github.com/bmizerany/assert
go get bitbucket.org/bmizerany/assert
go get code.google.com/p/assert
go get launchpad.net/assert
由於Go已經“內建”了github、google code等的版本控制工具類型,因此我們無需再做任何額外指定,只需用代碼的url(去掉http://)即可。
執行get後,代碼會被下載到GOPATH環境變數配置中的第一個路徑下的src目錄下面。例如:我們的GOPATH=/home/tonybai /goworkspace1:/home/tonybai/goworkspace2,執行go get github.com/bmizerany/assert後,我們將在/home/tonybai/goworkspace1下看到github.com 目錄,而assert包在本地的完整路徑就是/home/tonybai/goworkspace1/github.com/bmizerany /assert。這樣我們在代碼中直接import "github.com/bmizerany/assert"即可使用assert這個第三方包了。
在組織內部我們也會有自己的私人公用程式碼程式庫,一份程式碼程式庫可能被多重專案所使用。在每個項目中都儲存一份公用庫代碼顯然是不利於後續版本升級維護的,這樣就需要各個項目統一從同一個地方擷取或更新公用庫代碼。這種情況我們同樣可以用go get命令來做。
假設內部使用subversion作為版本控制工具,公用庫架設在10.10.12.13/svn0/share/golib。這時我們不能簡單地的通 過"go get 10.10.12.13/svn0/share/golib"來擷取到代碼,我們需要告訴get我們採用哪種版本控制工具,而這種資訊的傳遞是通過在庫名稱後面加上尾碼的方式進行的。比如:
go get "10.10.12.13/svn0/share/golib.svn"
這樣在/home/tonybai/goworkspace1下就會出現10.10.12.13/svn0/share/golib.svn目錄結構。我 們在代碼中可以直接import對應的包,比如import "10.10.12.13/svn0/share/golib.svn/assert"。
通過對get命令特性的瞭解,我們也可以確定分發的程式碼封裝到底應該如何組織。從上面的例子我們可以看出我們分發的程式碼封裝結構不需很複雜,直接在庫的 repository下建立包目錄即可,比如上面例子中庫repository為golib,assert就是直接建立在下面的目錄,同時也是包名。
go get可自動識別http_proxy環境變數,這樣Go也可以通過代理擷取外部程式碼封裝。
使用外部程式碼封裝的項目可以通過go get -u url來更新程式碼封裝版本為最新版本。
2012, bigwhite. 著作權.