包管理工具govendor
一、go找包逻辑
在执行 go build
或 go run
命令时,会按照以下顺序去查找包:
- 当前包下的
vendor
目录 - 向上级目录查找,直到找到
src
下的vendor
目录 - 在
GOROOT
目录下查找 - 在
GOPATH
下面查找依赖包
二、vendor使用建议
- 一个库工程(不包含
main
的package
)不应该在自己的版本控制中存储外部的包在vendor
目录中,除非有特殊原因并且知道为什么要这么做。 - 在一个应用中,(包含
main
的package
),建议只有一个vendor
目录,且在代码库一级目录。
三、govendor 简介
govendor 是一个基于 vendor 目录机制的包管理工具。
- 支持从项目源码中分析出依赖的包,并从
$GOPATH
复制到项目的vendor
目录下 - 支持包的指定版本,并用
vendor/vendor.json
进行包和版本管理,这点与 PHP 的Composer
类似 - 支持用
govendor add/update
命令从$GOPATH
中复制依赖包 - 如果忽略了
vendor/*/
文件,可用govendor sync
恢复依赖包 - 可直接用
govendor fetch
添加或更新依赖包 - 可用
govendor migrate
从其他vendor
包管理工具中一键迁移到govendor
- 支持
Linux
,macOS
,Windows
,甚至现有所有操作系统 - 支持
Git
、Hg
、SVN
,BZR
(必须指定一个路径)
go
中所有的project代码都要放在GoPATH
下的src
目录下,因而会存在全局GoPATH
和项目的GoPATH
。本地开发,可以直接都放在全局的GoPATH
下,然后每个项目用govendor
的方式添加相关依赖包
我们可以直接在命令行输入如下命令
go get -u github.com/kardianos/govendor
进行安装
接着使用一套连招:
govendor init # 创建vendor目录,创建vendor.json文件
govendor add +external #生成依赖包(添加外部包,不包含项目代码)
govendor update +vendor # 更新vendor的包命令
命令解析:
状态 | 缩写状态 | 含义 |
---|---|---|
+local | l | 本地包,即项目自身的包组织 |
+external | e | 外部包,即被 $GOPATH 管理,但不在 vendor 目录下 |
+vendor | v | 已被 govendor 管理,即在 vendor 目录下 |
+std | s | 标准库中的包 |
+unused | u | 未使用的包,即包在 vendor 目录下,但项目并没有用到 |
+missing | m | 代码引用了依赖包,但该包并没有找到 |
+program | p | 主程序包,意味着可以编译为执行文件 |
+outside | 外部包和缺失的包 | |
+all | 所有的包 |
命令 | 功能 |
---|---|
init | 初始化 vendor 目录 |
list | 列出所有的依赖包 |
add | 添加包到 vendor 目录,如 govendor add +external 添加所有外部包 |
add PKG_PATH | 添加指定的依赖包到 vendor 目录 |
update | 从 $GOPATH 更新依赖包到 vendor 目录 |
remove | 从 vendor 管理中删除依赖 |
status | 列出所有缺失、过期和修改过的包 |
fetch | 添加或更新包到本地 vendor 目录 |
sync | 本地存在 vendor.json 时候拉去依赖包,匹配所记录的版本 |
get | 类似 go get 目录,拉取依赖包到 vendor 目录 |
命令举例:
govendor add +local #会将本地的项目包(代码)也添加到vendor目录下
# 拉取最新包(指定版本,按版本拉,不指定按最新拉)
govendor fetch github.com/astaxie/beego@=v1.10.0
# 同步依赖包(如果某个包误删,verdor.json存在即可依其进行拉取)
govendor sync