一 :vendor
vendor概念最早是由Keith提出,用来存放依赖包。在版本1.5出现。
vendor的层级搜索
规则是:
- 从引用文件所在的
vendor
路径下面搜索, - 如果没有找到,那么从上层目录的
vendor
路径下面搜索, - 直到
src
的vendor
路径下面搜索。
二 :modules
Go 1.11版本支持临时环境变量GO111MODULE,通过该环境变量来控制依赖包的管理方式。当GO111MODULE的值为on时,那么就会使用modules功能,这种模式下,$GOPATH不再作为build时导入的角色,依赖包会存放在$GOPATH/pkg/mod目录下。工程中的依赖包也会从此目录下查找。有关该功能的介绍,可以看Go1.1.1新功能module的介绍及使用。
查找顺序
O111MODULE=off时,如果一个包在vendor和$GOPATH下都存在,那么使用顺序为:
优先使用vendor目录下面的包,
如果vendor下面没有搜索到,再搜索$GOPATH/src下面的包,
如果$GOPATH下面没有搜索到,那么搜索$GOROOT/src下面的包,
要么完整使用vendor下面的包,要么完整使用$GOPATH下面的包,不会混合使用。
我们做一个总结,如果存在vendor 的情况下,项目首先会从vendor 目录下搜索对应的包。如果 vendor 不存在则会搜索$GOPATH/src 下的包。