這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在使用go的過程中,我們有時候會引入一些第三方庫來使用,而通常的方式就是使用go get
,但是這種方式有一個很嚴重的問題,如果第三方庫更新了相關介面,很有可能你就無法使用了,所以我們一套很好地包管理機制。
在讀生產環境下go語言最佳實務有感一文中,我介紹過soundcloud公司的做法,直接將第三庫的代碼check下來,放到自己工程的vendor目錄裡面,或者使用godep。
不過現在,我發現了一種更好的包管理方式gopkg。它通過約定使用帶有版本號碼的url來讓go tool去check指定的版本庫,雖然現在只支援github的go repositories,但是我覺得已經足夠強大。
一個很簡單的例子,我們通過如下方式擷取go的yaml包
go get gopkg.in/yaml.v1
而實際上,該yaml包對應的地址為:
https://github.com/go-yaml/yaml
yaml.v1表明版本為v1,而在github上面,有一個對應的v1 branch。
gopkg支援的url格式很簡單:
gopkg.in/pkg.v3 → github.com/go-pkg/pkg (branch/tag v3, v3.N, or v3.N.M)gopkg.in/user/pkg.v3 → github.com/user/pkg (branch/tag v3, v3.N, or v3.N.M)
我們使用v.N的方式來定義一個版本,然後再github上面對應的建立一個同名的分支。gopkg支援(vMAJOR[.MINOR[.PATCH]])
這種類型的版本模式,如果存在多個major相同的版本,譬如v1,v1.0.1,v1.1.2,那麼gopkg會選用最進階別的v1.1.2使用,譬如有如下版本:
- v1
- v2.0
- v2.0.3
- v2.1.2
- v3
- v3.0
那麼gopkg對應選用的方式如下:
- pkg.v1 -> v1
- pkg.v2 -> v2.1.2
- pkg.v3 -> v3.0
gopkg不建議使用v0,也就是0版本號碼。
gopkg同時列出了一些建議,在更新代碼之後是否需要升級主要版本或者不需要,一些必須升級主要版本的情況:
- 刪除或者重新命名了任何的匯出介面,函數,變數等。
- 給介面增加,刪除或者重新命名函數
- 給函數或者介面增加參數
- 更改函數或者介面的參數或者傳回值類型
- 更改函數或者介面的傳回值個數
- 更改結構體
而一下情況,則不需要升級主要版本號:
- 增加匯出介面,函數或者變數
- 給函數或者介面的參數名字重新命名了
- 更改結構體
上面都提到了更改結構體,譬如我給一個結構體增加欄位,就可能不需要升級主要版本,但是如果刪除結構體的一個匯出欄位,那就必須要升級了。如果只是單純的更改改結構體裡面非匯出欄位的東西,也不需要升級。
更加詳細的資訊,請直接查看gopkg
可以看到,gopkg使用了一種很簡單地方式讓我們方便的對go pakcage進行版本管理。於是我也依葫蘆畫瓢,給我的log package做了一個v1版本的,你可以直接go get gopkg.in/siddontang/go-log.v1/log
。