Go の module cache と vendor の違い
Go の module cache と vendor の違いがよく分からなかったので調べた。結論としては、違いというか go.mod に記述されているバージョンによってデフォルトで module cache と vendor のどちらを go run
や go 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 を使っていて、現在は移行・後方互換性のために残留しているっぽい。詳しくは分からない。