Go Module 如何發佈 v2 以上版本

golang logo

Go ModuleGolang 推出的一套件管理系統,在 Go 1.11 推出後,許多 Package 也都陸續支援 Go Module 取代舊有的套件管理系統,像是 govendor 或 dep 等,而再過不久之後,保留 vendor 的方式也會被移除,畢竟現在開發已經不需要在 GOPATH 目錄底下了。對於 Go Module 不熟的話,建議先看官方今年寫的一篇教學部落格,底下是教學會涵蓋的範圍

  • Creating a new module.
  • Adding a dependency.
  • Upgrading dependencies.
  • Adding a dependency on a new major version.
  • Upgrading a dependency to a new major version.
  • Removing unused dependencies.

而本篇最主要會跟大家探討如何發佈 v2 以上的套件版本。

教學影片

更多實戰影片可以參考我的 Udemy 教學系列

go.mod 版本管理

使用 go mod init 之後會在專案目錄產生 go.mod 檔案,裡面可以看到像是底下的訊息

module github.com/go-ggz/ggz

go 1.12

require (
    firebase.google.com/go v3.8.0+incompatible
    github.com/appleboy/com v0.0.1
    github.com/appleboy/gofight/v2 v2.0.0
    gopkg.in/nicksrandall/dataloader.v5 v5.0.0
    gopkg.in/testfixtures.v2 v2.5.3
    gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8
)

Go module 版本發佈請遵守 semver.org 規範,當然不只有 Go 語言,發佈其他語言的套件也請務必遵守。而在 Go module 內有說明『Semantic Import Versioning』裡面大意大致上是說,如果你的套件版本是 v1 以下,像是 v1.2.3,可以直接透過 go get xxxx 方式將套件版本寫入 go.mod,但是看上面的例子,可以發現有些奇怪的字眼,像是 +incompatible 等。如果是看到像底下的套件

    firebase.google.com/go v3.8.0+incompatible

表示使用此套件版本大於 v1 這時候是不可以直接下 go get firebase.google.com/go,而要在最後補上 v3

$ go get firebase.google.com/go/v3

就如同上面的

    github.com/appleboy/gofight/v2 v2.0.0
    gopkg.in/nicksrandall/dataloader.v5 v5.0.0
    gopkg.in/testfixtures.v2 v2.5.3

而可以發現 gopkg.in 服務已經符合 semver 的需求在做後面補上了 .v2.v5 所以並不會出現 +incompatible 字眼,另外在看

v2.0.0-20180128182452-d3ae77c26ac8

只要後面的格式出現 YYYYmmdd 這種格式表示該套件不支援 Go Module。

發佈 v2 以上版本方式

官方提供了兩種做法讓開發者可以發佈 v2 以上版本,一種是透過主 branch,另一種是建立版本目錄,底下來一一說明,第一種是直接在主 branch,像是 master 內的 go.mod 內補上版本,底下是範例:

module github.com/appleboy/gofight/v2

這時候你就可以陸續發佈 v2 版本的 Tag。大家可以發現這個方式,是不需要建立任何 sub folder,而另外一種方式是不需要改動 go.mod,直接在專案目錄內放置 v2 目錄,然後把所有程式碼複製一份到該目錄底下,接著繼續開發,這方式我個人不太建議,原因檔案容量會增加很快,也不好維護。