govendor 使用

Golang 包管理工具 govendor 使用技巧

govendor

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

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

包状态类型

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

状态缩写含义
+locallpackages in your project 本地包,即项目自身的包组织
+externale被引用、在$GOPATH下找得到、但当前项目不存在的包
+vendorv已被 govendor 管理,即在 vendor 目录下
+stds标准库中的包
+excludedx明确从vendoring中排除的外部包
+unusedu未使用的包,即包在 vendor 目录下,但项目并没有用到
+missingm代码引用了依赖包,但该包并没有找到
+programp主程序包,意味着可以编译为执行文件
+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命令添加:

1
govendor list -no-status +e | grep -v 'myteam/common' | xargs govendor add
使用 Hugo 构建
主题 StackJimmy 设计