gopkg:一種方便的go pakcage管理方式


在使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM