Go module 如何釋出 v2 及以上版本?

astaxie發表於2020-12-21

用上 Go module 之後,釋出的版本都在 v1 上面,用了這麼長時間遇到了升級 v2 版本的問題。記錄一下。

用上 go mod 之後,依賴包都是通過版本打 tag 的形式確定版本號。比如 github.com/mnhkahn/gogogo v1.0.9。每次都改動都是在累加低位的版本號,一直這麼用也挺安逸的。突然有一天,我的一個底層包需要大改,導致和之前的版本徹底不相容,這種情況下如何設定版本號,如何能讓呼叫方成功接入?

Go module 版本號

先講一下 Go 在用的版本號協議 semver (Semantic Versioning)。它定義的版本號格式是:

vMAJOR.MINOR.PATCH
  • MAJOR 主版本號,如果有大的版本更新,導致 API 和之前版本不相容。我們遇到的就是這個問題。
  • MINOR 次版本號,當你做了向下相容的新 feature。
  • PATCH 修訂版本號,當你做了向下相容的修復 bug fix。
  • v 所有版本號都是 v 開頭。

比如我們用的 Go 語言,目前是 1.12.0。它還是 Go 1,每次升級都保證是相容的,12 的版本號是新 feature,而最末尾的版本號是修復。說明當前的版本上了之後還沒有修復過問題。

我這次也是搞了一個不相容的更新,所以需要升級到 v2.0.0。

Go 專案如何升級 v2?

假設你的專案已經支援 go module 了。

  1. 修改 go.mod 第一行,在 module 那行最後加上/v2。module github.com/mnhkahn/aaa/v2
  2. 對於不相容的改動(除了 v0 和 v1),都必須顯示得修改 import 的路徑。所以我們的引用需要改成 import "github.com/mnhkahn/aaa/v2/config"。在所有的地方都需要修改,包括自己的包內和呼叫方包。
  3. 底層包的更新有個小工具可以幫助快速實現 mod。GO111MODULE=on go get github.com/marwan-at-work/mod/cmd/mod mod upgrade
  4. 程式碼提交之後需要打新 tag,v2.0.0。
  5. 呼叫方修改引用程式碼,需要加 v2,和第二步提到的一樣。 go get github.com/mnhkahn/aaa/v2

incompatible

有時候你能在 go.mod 檔案中發現不相容的標記,v3.2.1+incompatible,這是因為這個依賴包沒有使用 go module,並且它通過 git 打了 tag。

v0.0.0-20190312205133-abcdefghijklm

對於沒有打 tag 的倉庫,go.mod 就會很醜陋,它的格式是 pseudo-version。它的含義是 v0.0.0-yyyymmddhhmmss-abcdefabcdef。

tag 刪除了重建為什麼沒效果?

困擾了我很久的一個問題。有一個 tag v2.0.0 的程式碼有問題,我刪除了這個 tag,新建了一個好的版本,但是 go get 依然報錯,困擾了很久,一直以為是 v2 的版本號寫錯了。後來才發現是 go 有本地快取,快取在 $GOPATH/pkg/mod/cache下面,把裡面的內容清掉,重新獲取即可。

更多詳情請餐卡Go 1.11 Modules

原文地址:https://blog.cyeam.com/go/2019/03/12/go-version

更多原創文章乾貨分享,請關注公眾號
  • Go module 如何釋出 v2 及以上版本?
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章