概要
自分的に少しハマったので忘れないうちにメモメモ。
自作のモジュールを作っていて、それを利用するプログラムも書いていたとします。
ライブラリの方のバージョンが現在 v1.x.x として、大きな機能を入れたので v2.0.0 に上げようと思います。
Goでは Semantic versioning でパッケージのバージョン管理をすることになっているので
$ git tag -a v2.0.0 -m "bump version to v2.0.0" $ git push origin master --tags
とかして、タグ作ってpushしました。
メジャーバージョンアップするということは、後方互換性を崩すということなので
クライアント側(ライブラリを利用する側)にも、v2 を利用する場合は手を入れる必要があります。
を参考にさせていただいて
import している部分を
"path/to/module"
ってしてた部分を
"path/to/module/v2"
という風に変更し、実行!
$ go run main.go go: finding path/to/module/v2 v2.0.0 build command-line-arguments: cannot load path/to/module/v2: module path/to/module@latest found (v1.1.2), but does not contain package path/to/module/v2
失敗する・・・。何故に?
メジャーバージョンをアップする場合はライブラリ側のgo.modも変更が必要
なんか、良くわからなかったのでいろいろ情報を探していたところ、以下がヒット。
v2以降にメジャーバージョンアップする際は、go.modのmoduleパスを変更しておかないといけない模様。
上の最初のリンクで例として挙げられていた echo の go.mod を見てみると
echo/go.mod at master · labstack/echo · GitHub
ほんとだ。。v4って付いてる。。
てことで、ライブラリ側のgo.modの
module path/to/module
となっている部分を
module path/to/module/v2
に変更。んで、commit して push!!
クライアント側で、v2がダウンロードできるか再度挑戦。
$ go run main.go go: finding path/to/module/v2 v2.0.0 build command-line-arguments: cannot load path/to/module/v2: module path/to/module@latest found (v1.1.2), but does not contain package path/to/module/v2
失敗する・・・。何故に?
tagを作成してなかった
先程、go.modのmoduleを変更した後にtagを作っていなかったのが原因でした。
$ git tag -a v2.0.1 -m "bump version to v2.0.1" $ git push origin v2.0.1
再再度、挑戦。
$ go run main.go go: finding path/to/module/v2 v2.0.1 go: downloading path/to/module/v2 v2.0.1 go: extracting path/to/module/v2 v2.0.1 --**HELLO**--
きたー!やっと動いてくれたw
これから先は v3 でも v4 でも同じ手順です。
v2以降が特殊な扱いになるんですねー。勉強になりました。
テストで使っていたリポジトリをついでにアップしました
今回の勉強で使っていたリポジトリをついでなんで、アップしておきました。
バージョン毎にどのような形で go mod が動くかを、お試ししたい方いらっしゃったらよかったらどうぞ。
何回もトライアンドエラーしてたので、ガンガンバージョンを上げていて、v4 までありますw
README.md に各メジャーバージョン毎の呼び出し方を書いてあります。
git tag のメモ
参考情報
Using Go Modules - The Go Blog
Migrating to Go Modules - The Go Blog
Publishing Go Modules - The Go Blog
Go Modules: v2 and Beyond - The Go Blog
和訳: Go += Package Versioning (Go & Versioning, Part 1) - Qiita
和訳: A Tour of Versioned Go (vgo) (Go & Versioning, Part 2) - Qiita
和訳: Semantic Import Versioning (Go & Versioning, Part 3) - Qiita
GoにおけるSemantic versioningとgo.modにある+incompatibleについて - Qiita
Go Modules and Major Versions | Code Engineered
how to upgrade go mod to v2 or higher version? - Stack Overflow
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場