从Go 1.11开始引入module,用于版本管理。
通过使用module,工程目录的位置不用必须放在GOPATH下。
当前版本是1.13,下文中将以Go1.13为例介绍module。
在Go 1.13中,继续使用临时环境变量GO111MODULE来设置是否使用module。
1.关于GO111MODULE
GO111MODULE 可设置为off, on, 或auto (默认)。
1.1 GO111MODULE=on
如果GO111MODULE=on, go command 将使用modules查找依赖包,不再使用GOPATH。一般称为"module-aware mode"。
在module-aware mode下,GOPATH 是无意义的,不过它还是会把下载的依赖包存储在 $GOPATH/pkg/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中(如果GOBIN没有设置)。
使用module的情况下,执行go commands(go build, go test ....等),自动添加依赖到go.mod中。
1.2 GO111MODULE=off
如果 GO111MODULE=off,go command不再使用module查找依赖包,而是在vendor目录和GOPATH查找依赖包。一般称为"GOPATH mode."
1.3 GO111MODULE=auto 或没有设置
如果 GO111MODULE=auto 或没有设置, go command是否使用module取决于是否存在go.mod文件。
如果当前目录,或父目录中存在go.mod文件,那么go command就会使用module,否则不会使用module。
特别说明下,
在Go 1.13中,如果GO111MODULE=auto或没有设置,并且只要有 go.mod 文件,就会使用module, 甚至即使在GOPATH下,也一样。
Go 1.13以前, 如果在GOPATH下,即使GO111MODULE=auto或没有设置,也无法使用module。
2.Modules 与 vendoring
当使用modules的时候,go command 会自动下载依赖包(存放路径GOPATH/pkg/mod),并会完全忽略vendor目录。
为了与老版本的Go兼容,或者想把所有的依赖包放在一个目录下,go语言提供了 'go mod vendor' 。
使用 'go mod vendor' ,可以在主module下的根目录下创建一个名为'vendor'目录,里面存放所有的go build、go test使用的依赖包。
编译时,使用'go build -mod=vendor',这样就会使用vendor目录的依赖包,而不再使用网络和本地缓存。
这里vendor目录必须是主module的顶级vendor目录,其他位置的vendor目录会被忽略。
3.参考
How do I use vendoring with modules? Is vendoring going away?