文章

go vendor指北

vendor的种类

golangvendor分为两种

  • 不启用modgovendor。这里的govendor是一个需要独立安装的工具。这个的操作逻辑比较复杂,因为关联了gopath的逻辑。好在现在绝大多数项目都启用了mod进行包管理,我们并不需要知道。
  • 启用mod后,vendor是一个mod的内建指令,使用方式为go mod vendor。以下将具体阐述相关细节。

vendor的工作方式

当程序进行编译时,会根据mod文件里的库路径及版本拉去gopath对应的源码进行编译(不考虑cgo的情况下),如果本地路径下存在vendor,会从vendor中拉去对应的源码进行编译。这个可以避免各种私有库、或者网络原因导致协作者无法根据mod拉去对应的库。此时我们相当于把库附在源码里上传gitsvn。坏处就是协作方在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