yn2011's blog

技術メモ

Go の module cache と vendor の違い

Go の module cache と vendor の違いがよく分からなかったので調べた。結論としては、違いというか go.mod に記述されているバージョンによってデフォルトで module cache と vendor のどちらを go rungo build 時に使うかが異なる。

環境

  • Go 1.15.3
  • $GO111MODULE = ON

module cache

  • 外部のモジュールに依存したコードをビルドする場合、依存モジュールを1度ダウンロードする。ダウンロードしたモジュールは、$GOPATH/pkg/mod/ にキャッシュされるので次回のビルド時には再度ダウンロードする必要はなくなる。
  • go clean --modcache で消せる
  • go run -mod=mod フラグで明示的に module cache を使用するように指定できる

vendor

  • go mod vendor すると外部の依存モジュールを vendor ディレクトリにダウンロードする
  • go run -mod=vendor で明示的に vendor ディレクトリを使用するように指定できる
  • コードのビルド時のデフォルト動作として、 vendor が使われるかどうかは、go.mod ファイルのバージョン記述に依存する。
// go.mod

module github.com/pokuwagata/ichigo-cli

go 1.15 <- これ

require github.com/urfave/cli/v2 v2.1.1
  • Go 1.14 以降は vendor が優先して使用される。1.14 未満の場合は module cache が優先される。

なぜ module cache と vendor の両方が存在するのか

  • module mode は Go 1.11 から使えるようになったが、それ以前は module cache を使っていて、現在は移行・後方互換性のために残留しているっぽい。詳しくは分からない。

参考