在使用go的過程中,我們有時候會引入一些第三方庫來使用,而通常的方式就是使用go get
,可是這樣的方式有一個非常嚴重的問題,假設第三方庫更新了相關接口,非常有可能你就無法使用了,所以我們一套非常好地包管理機制。
在讀生產環境下go語言最佳實踐有感一文中,我介紹過soundcloud公司的做法,直接將第三庫的代碼check下來,放到自己project的vendor文件夾里面,或者使用godep。
只是如今,我發現了一種更好的包管理方式gopkg。它通過約定使用帶有版本號號的url來讓go tool去check指定的版本號庫,盡管如今僅僅支持github的go repositories,可是我認為已經足夠強大。
一個非常easy的樣例,我們通過例如以下方式獲取go的yaml包
go get gopkg.in/yaml.v1
而實際上,該yaml包相應的地址為:
https://github.com/go-yaml/yaml
yaml.v1表明版本號為v1,而在github上面,有一個相應的v1 branch。
gopkg支持的url格式非常easy:
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使用了一種非常easy地方式讓我們方便的對go pakcage進行版本號管理。於是我也依葫蘆畫瓢,給我的log package做了一個v1版本號的,你能夠直接go get gopkg.in/siddontang/go-log.v1/log
。