takuroooのブログ

勉強したこととか

1リポジトリに複数go.modがある場合どうやって各モジュールに異なるバージョンを付与するか

[追記]
公式ドキュメントに解説が書いてあったので英語読める人はこちらを読んでください。

go.dev

前置き

1つのGitHubリポジトリにgo.modが1つある場合、そのモジュールのバージョン = gitのタグになる。
gitのタグでv1.0.0というタグをつければ、モジュールのバージョンもv1.0.0になる。
go-libというリポジトリであれば、下記コマンドでバージョンを指定してモジュールを取得できる。

go get github.com/takurooo/go-lib@v1.0.0

では複数のgo.modが1つのリポジトリにある場合はどうすればいいのか。

やり方

gitのタグ名にモジュールのパスも付ければOK
以下のようなディレクトリ構造のgo-multi-versionというリポジトリがあったとする。

.
├── module1
│   ├── go.mod
│   └── module1.go
└── module2
    ├── go.mod
    └── module2.go

module1にv0.0.1を付けたい場合はタグ名をmodule1/v0.0.1にする。
module2にv1.0.0を付けたい場合はタグ名をmodule2/v1.0.0にする。
タグ名にモジュールまでのパスを含めることで各モジュールごとにバージョンを付与することができる。

go getするときは以下のように実行する。

go get github.com/takurooo/go-multi-version/module1@v0.0.1
go get github.com/takurooo/go-multi-version/module2@v1.0.0

以下のようにバージョン指定するとエラーになる。

go get github.com/takurooo/go-multi-version/module1@v1.0.0
go get github.com/takurooo/go-multi-version/module2@v0.0.1

ちなみにAWS SDKは1つのリポジトリに複数のgo.modを持っている。

github.com

実験したリポジトリ

github.com