go 1.12でmoduleが読めない問題

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