govendor 使用
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
下。
这时候可以结合list
和add
来使用,
先用list -no-status +e
列出依赖包,然后使用grep
过滤,再调用add
命令添加:
govendor list -no-status +e | grep -v 'myteam/common' | xargs govendor add