search
LoginSignup
2

More than 3 years have passed since last update.

posted at

updated at

Goモジュールモードでモジュール内に作ったモジュールを扱う

GoModule、大変便利ですね。
便利なのですがちょっと大きめのシステムを組もうとした時に頭を悩ませることが出てくるかと思います。

ちょっと大きめのシステムになると機能別にディレクトリを作って構成を分割したいという要求が出てくるかと思うのですが、
素直にGoModuleを利用するとこういったケースを上手く対応することができないのです。

想定する構成

sampleモジュールの中に、module1、module2というsampleモジュールから利用するためのサブモジュールが定義されています。

sample/
  module1/
    module1.go
    go.mod
  module2/
    module2.go
    go.mod
  main.go
  go.mod

importする

このような構成にした時、このモジュール内にあるモジュールは呼び出し側からは以下のようにインポートします。

main.go
package main

import (
    "github.com/sample/module1"
    "github.com/sample/module2"
)

このように書くとサブモジュールのコードを取得するためにgithub1へアクセスしてコードを取得してきます。
githubにアクセスするということはgithubへコミットされていないコードは反映されないということです。

一般的に、サブモジュールはその場で変更したら即座に利用側へ反映されてほしいはずです。

モジュール内モジュールは、ローカルのコードを参照するようにする

この問題は、go.modファイルにreplaceというキーワードを利用してモジュール名とパスの関連をつくることで解決することができます。

go.mod
replace (
    github.com/sample/module1 => ./module1
    github.com/sample/module2 => ./module2
)

このように書いておくと、GoModuleは以下のようなrequire文を追記してくれ、無事モジュール内モジュールのコードはローカルのコードを参照してビルドしてくれるようになります。

go.mod
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
)

参考リンク


  1. この例はgithubを利用しているため、githubと記述しています。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2