6.5 Go Modulesの実践的な使い方

6.5.1 1リポジトリ、マルチモジュール構成

Go Modulesでは、1つのリポジトリ中に複数のモジュールが存在する、いわゆる「モノレポ」の構成を選択できます。次のディレクトリ構成には2つの go.mod が存在していて、それぞれ別のモジュールとして判断されます。

.
├── entrypoint
│   ├── go.mod (github.com/myorg/app/entrypoint)
│   └── main.go
└── storage    (github.com/myorg/app/storage)
    ├── go.mod
    └── storage.go

一般的には1リポジトリ1モジュールの構成がシンプルで望ましい形ですが、アプリケーションのシステム構成によっては、リポジトリ間に依存関係が存在することもあります。ある変更が複数のリポジトリに波及して、それぞれのリポジトリにプルリクエストを発行したり、マージのタイミングに注意したりする機会が増えてきたら1、複数のリポジトリを1つに集めたマルチモジュール構成への移行を検討する頃合いです。

2つのモジュールに依存関係があり、entrypointstorageモジュールを利用しようとしているとします。何もしないと、entrypointはローカルに依存モジュールがあるのに、リポジトリから新規にダウンロードしてそちらを利用しようとします。せっかくモノレポ構成にしても、一度pushしないとビルドできなくなってしまいます。幸い、Go Modulesは、GitHubのようなバージョン管理システムのリポジトリにあるモジュールを参照するだけでなく、ローカルのモジュールも直接参照できます。上記のように2つのモジュールで構成されている例について考えてみます。 ...