govendor

go vendor 是 go 1.6 官方正式引入的包管理方式。

其基本思路是,将引用的外部包的源代码放在当前工程的vendor目录下面,go 编译时会优先从vendor目录寻找依赖关系。

包状态类型

首先要知道govendor对包状态的分类:

状态 缩写 含义
+local l packages in your project 本地包,即项目自身的包组织
+external e 被引用、在$GOPATH下找得到、但当前项目不存在的包
+vendor v 已被 govendor 管理,即在 vendor 目录下
+std s 标准库中的包
+excluded x 明确从vendoring中排除的外部包
+unused u 未使用的包,即包在 vendor 目录下,但项目并没有用到
+missing m 代码引用了依赖包,但该包并没有找到
+program p 主程序包,意味着可以编译为执行文件
+outside +external +missing
+all 所有的包

常用的三种为:

  • external: 放在$GOPATH 下被依赖的包(最常用)
  • local: 项目自身的包
  • vendor: 被govendor管理的,放在vendor目录下的包

命令

命令 功能
init 初始化 vendor 目录
list 列出所有的依赖包
add 添加包到 vendor 目录,如 govendor add +external 添加所有外部包,也可以直接跟包名,如 govendor add golang.org/x/net/internal/socket
update 从 $GOPATH 更新依赖包到 vendor 目录
remove 从 vendor 管理中删除依赖(add 的反操作)
status 列出所有缺失、过期和修改过的包
fetch 添加或更新包到本地 vendor 目录
sync 本地存在 vendor.json 时候拉去依赖包,匹配所记录的版本
get 类似 go get 目录,拉取依赖包到 vendor 目录

基本操作

govendor status: 查看当前包状态

govendor list +e: 查看当前项目的依赖但是未被添加到vendor中的包

govendor add +e: 添加依赖的包。如果vendor.json中存在,但是vendor目录下不存在(即govendor status显示缺失)的包也会被重新添加

govendor remove +u: 删除在vendor下但是未依赖的包

在实际过程中,有部分包是团队的公共包。 这部分包通常有自己的单独项目,并且已经被我们添加到$GOPATH下,可能就不需要添加到当前项目的vendor下。

这时候可以结合listadd来使用, 先用list -no-status +e列出依赖包,然后使用grep过滤,再调用add命令添加:

govendor list -no-status +e | grep -v 'myteam/common' | xargs govendor add