go1.12から本格導入のgo moduleはcannot find moduleとかunknown import pathとか色々エラーに悩まされたものの、ようやく仕様が分かってきた。 というわけでまとめておく。 ちなみにこれ、リポジトリはプライベートになっているの前提で。 パブリックならそんなに問題にならないです。

エラーの原因

要はプライベートリポジトリを読んでくれない。 だからそれなりに手間暇加えないといけないのですね。

モジュール名

go.modはgithub.comから始まるリポジトリ名にすること。 go mod init github.com/xxxxx という感じ。 じゃないとサブディレクトリをうまく読めない。

import

これは import "github.com/xxx/subdir" という感じにすれば良い。

buildを実行する場所

トップでやること。 例えば/main/main.goとかいうファイル構成になっていたとしても/main/配下でgo buildしちゃだめ。エラーになります。 んで、トップで実行する際mainディレクトリを指定すること。 つまり、

go build /main/

って感じ。

サブディレクトリにgo.modは置かない

ここに置いちゃうと別モジュールとして認識されるっぽくて、やっぱりプライベートリポジトリが読めないエラーになる。

replace

もしどうしてもトップ以外からビルドしたい場合はreplaceを使いましょ。 go mod edit -replace github.xxx/=>./xxx みたいなコマンドを打てばちゃんとプライベートリポジトリでも読んでくれます。 その際xxxにもgo.modを配置すること。別パッケージ扱いになるので。