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