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を配置すること。別パッケージ扱いになるので。