GoModule、大変便利ですね。
便利なのですがちょっと大きめのシステムを組もうとした時に頭を悩ませることが出てくるかと思います。
ちょっと大きめのシステムになると機能別にディレクトリを作って構成を分割したいという要求が出てくるかと思うのですが、
素直にGoModuleを利用するとこういったケースを上手く対応することができないのです。
想定する構成
sampleモジュールの中に、module1、module2というsampleモジュールから利用するためのサブモジュールが定義されています。
sample/
module1/
module1.go
go.mod
module2/
module2.go
go.mod
main.go
go.mod
importする
このような構成にした時、このモジュール内にあるモジュールは呼び出し側からは以下のようにインポートします。
package main
import (
"github.com/sample/module1"
"github.com/sample/module2"
)
このように書くとサブモジュールのコードを取得するためにgithub1へアクセスしてコードを取得してきます。
githubにアクセスするということはgithubへコミットされていないコードは反映されないということです。
一般的に、サブモジュールはその場で変更したら即座に利用側へ反映されてほしいはずです。
モジュール内モジュールは、ローカルのコードを参照するようにする
この問題は、go.mod
ファイルにreplace
というキーワードを利用してモジュール名とパスの関連をつくることで解決することができます。
replace (
github.com/sample/module1 => ./module1
github.com/sample/module2 => ./module2
)
このように書いておくと、GoModuleは以下のようなrequire文を追記してくれ、無事モジュール内モジュールのコードはローカルのコードを参照してビルドしてくれるようになります。
replace (
github.com/sample/module1 => ./module1
github.com/sample/module2 => ./module2
)
require (
github.com/sample/module1 v0.0.0-00010101000000-000000000000
github.com/sample/module2 v0.0.0-00010101000000-000000000000
)
参考リンク
-
この例はgithubを利用しているため、githubと記述しています。 ↩