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