這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。> 查看原文:[blog.keyboardman.me](https://blog.keyboardman.me/2018/02/23/early-adopters-versioned-go/)一直以來,對go來說依賴包的版本控制上沒有一個好的方案,當前主要有兩種方式`Import Versioning`和`Semantic Versioning`。* Import Versioning:`gopkg.in`網站,其實是GitHub版本變化的重新導向器,你可以通過`gopkg.in/yaml.v1`和`gopkg.in/yaml.v2` 的這樣的匯入方式來指向Git庫的不同提交版本* Semantic Versioning:制定了一個檔案格式規範來描述管理vendor目錄下代碼的準確源和版本資訊(dep、glide)前幾天(2018-02-20)Russ Cox部落格上介紹了他為go設計的新工具`vgo`,這是為處理軟體包版本而設計的go工具的替代品,vgo即versioned go的縮寫,意即帶版本的go。vgo目前只能運行在go1.10之上,否則會得到`vgo objabi: cannot find GOMIPS`這樣的錯誤。首先安裝vgo。```bashgo get -u golang.org/x/vgo```我們先嘗試下,跟著[官方樣本](https://research.swtch.com/vgo-tour)。```bashmkdir $GOPATH/src/hellocd $GOPATH/src/hellocurl -sS https://swtch.com/hello.go > hello.go```我們看一下`hello.go`的內容。```gopackage main // import "github.com/you/hello"import ("fmt""rsc.io/quote")func main() {fmt.Println(quote.Hello())}```其中`// import "github.com/you/hello"`注釋用來告訴vgo模組的“匯入路徑名稱”應該是什麼,並且使用此模組的其他軟體包將用作匯入標識符。建立一個空的go.mod檔案來標記此項目的根目錄,然後編譯一下。```bashecho >go.modvgo build```可以看到產生可執行檔,並修改了`go.mod`的內容,自動產生了依賴關係。```bashmodule "github.com/you/hello"require "rsc.io/quote" v1.5.2````go.mod`檔案包含了模組所依賴包的最小版本。如果模組沒有提供一個`tag`版本。對於未命名的提交,`v0.0.0-yyyymmddhhmmss-commit `表示一個指定日期的提交。`go.mod`檔案還可以實現排除和替換的版本,需手動修改`go.mod`檔案。```bashexclude "rsc.io/sampler" v1.99.99replace "rsc.io/quote" v1.5.2 => "../quote"```但是,最重要的變化還是終結了`GOPATH`作為Go代碼工作空間的設定,由於`go.mod`檔案包含了完整的模組路徑並且還定義了每個使用的依賴的版本,因此包含`go.mod`檔案的目錄就可以被認為是一個分類樹的根目錄了,該分類樹作用於自身的工作空間,並且和其他類似的目錄彼此隔離。vgo其他功能```bashvgo list -m # 查看所有依賴vgo list -m -u # 查看所有依賴同時檢查更新,會列印出最新版本和目前的版本vgo test all # 執行所有測試,包括依賴包的測試vgo test http://rsc.io/sampler # 執行指定包測試vgo get -u # 更新所有依賴vgo list -t http://rsc.io/sampler # 檢查指定包所有可用的版本 即tagvgo get http://rsc.io/sampler@v1.3.1 # 擷取指定版本,並修改go.modvgo vendor # 退到vendor 相容不使用vgo的使用者...```vgo在下載github倉庫時,如果當前環境是未認證的帳號會受到限流影響,得到如下警告。```bashGitHub applies fairly small rate limits to unauthenticated users, andyou appear to be hitting them. To authenticate, please visithttps://github.com/settings/tokens and click "Generate New Token" tocreate a Personal Access Token. The token only needs "public_repo"scope, but you can add "repo" if you want to access privaterepositories too.```這時候需要擷取github token,在github網站依次點擊`Settings`-`Developer settings`-`Personal access tokens`-`Generate new token`,填寫名字和勾選許可權後產生token。建立或修改`$HOME/.netrc`檔案,添加下行,把產生的token填寫進去,就能解決了。```bashmachine api.github.com login YOU password TOKEN```目前vgo的文檔不夠完善,代碼也不夠健壯,在生產環境可能還不適合去使用。我在測試時就遇到了些問題,比如有的`gopkg.in`倉庫使用標籤而不是分支來標記主要版本。當前vgo處理這些倉庫會出錯。```goimport (_ "gopkg.in/natefinch/lumberjack.v2")```將得到如下錯誤。```bashimport "gopkg.in/natefinch/lumberjack.v2": unexpected status (https://api.github.com/repos/natefinch/lumberjack/commits?sha=v2&until=2018-02-23T03%3A49%3A22Z&per_page=2): 404 Not Found# 或vgo: import "gopkg.in/natefinch/lumberjack.v2": unexpected status (https://api.github.com/repos/natefinch/lumberjack): 403 Forbidden```不過vgo應該很快就會修複這些問題。1538 次點擊