go vendor指北
vendor的种类
golang
的vendor
分为两种
- 不启用
mod
的govendor
。这里的govendor
是一个需要独立安装的工具。这个的操作逻辑比较复杂,因为关联了gopath
的逻辑。好在现在绝大多数项目都启用了mod
进行包管理,我们并不需要知道。 - 启用
mod
后,vendor
是一个mod的内建指令,使用方式为go mod vendor
。以下将具体阐述相关细节。
vendor的工作方式
当程序进行编译时,会根据mod
文件里的库路径及版本拉去gopath
对应的源码进行编译(不考虑cgo
的情况下),如果本地路径下存在vendor
,会从vendor
中拉去对应的源码进行编译。这个可以避免各种私有库、或者网络原因导致协作者无法根据mod
拉去对应的库。此时我们相当于把库附在源码里上传git
、svn
。坏处就是协作方在pull
的时候会非常崩溃。。。
使用
当我们使用go mod vendor
的时候会将gopath
中所有的mod
提到的库补充至vendor
文件夹。因此最佳的使用方式是。
go mod tidy
go mod vendor
如果我们更新了某个依赖库,则应该执行。
go get -u xxx
go mod vendor
注意事项
- 保证每个项目仅有一个且位于根目录的
vendor
文件夹 - 保证每个启用
mod
功能 - 保证拉取时
gopath
中的代码是正确的(没有直接通过编辑器更改) - 禁止修改vendor中的代码
License:
CC BY 4.0