いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

Goメモ-35 (モジュールのメジャーバージョンを2以降にした場合の取り扱い方について)

概要

自分的に少しハマったので忘れないうちにメモメモ。

自作のモジュールを作っていて、それを利用するプログラムも書いていたとします。

ライブラリの方のバージョンが現在 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 を利用する場合は手を入れる必要があります。

qiita.com

を参考にさせていただいて

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も変更が必要

なんか、良くわからなかったのでいろいろ情報を探していたところ、以下がヒット。

codeengineered.com

stackoverflow.com

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

github.com

README.md に各メジャーバージョン毎の呼び出し方を書いてあります。

git tag のメモ

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


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com