#golang使用govendor教程
##环境
如果是go1.5,需要环境变量GO15VENDOREXPERIMENT=1,go1.6以上默认开启了这个功能
笔者版本为1.11,govendor版本为v1.0.9
##安装
建议把$GOPATH/bin加入到PATH中,方便使用govendor命令
go get -u github.com/kardianos/govendor
##应用
###初始化
进入项目根目录下执行以下命令,会在项目根目录下新建一个vendor目录,并在其中生成vendor.json(存储包的版本信息)
govendor init
###拉取包
根据已有的vendor.json从远程拉取包到vendor目录下,gopath目录下不会有拉下来的包 可以把现有的json文件copy过来哦!
govendor sync
从远程拉取包到vendor下并记录进vendor.json,gopath目录下不会有拉下来的包
govendor fetch [包链接,如:github.com/BurntSushi/toml]
等于go get 笔者使用的govendor版本下,govendor -h指令显示"govendor get"可以复制包到vendor目录下,实践中并没有
govendor get [包链接,如:github.com/BurntSushi/toml]
###添加包
添加包会同时在json文件中记录
把gopath下的包(只会是被项目引用到的包)添加到vendor目录下 必须vendor目录下没有,且vendor.json中没有记录这个包的时候才会添加,其中一个存在则命令无效亦不报错
govendor add +external(+e)
把项目中的包添加到vendor目录下 必须vendor目录下没有,且vendor.json中没有记录这个包的时候才会添加,其中一个存在则命令无效亦不报错
govendor add +local(+l)
把标准库的包添加到vendor目录下 必须vendor目录下没有,且vendor.json中没有记录这个包的时候才会添加,其中一个存在则命令无效亦不报错
govendor add +std(+s)
把主程序包(main包)添加到vendor目录下 必须vendor目录下没有,且vendor.json中没有记录这个包的时候才会添加,其中一个存在则命令无效亦不报错
govendor add +program(+p)
把指定包添加进vendor目录 vendor目录下已存在会报错,vendor.json存在该包记录不会报错会直接覆盖该记录
govendor add [包链接,如:github.com/BurntSushi/toml]
添加所有的包,包括gopath、go标准库、项目中的包 gopath和标准库下的包必须是被项目或者项目中引用到的包引用的才会添加
govendor add +all(+a)
###移除包
移除包的时候会把vendor目录和json文件的记录一起移除,只有vendor或者只有json中有仍然会移除而不提示
移除项目中的包
govendor remove +local(+l)
移除未被项目引用的包
govendor remove +unused(+u)
移除指定包
govendor remove [包链接,如:github.com/BurntSushi/toml]
移除vendor下所有的包
govendor remove +vendor(+v)
###其他操作
列出vendor下所有的包(不是根据json文件而是vendor文件夹)和项目中的包(本地包) vendor包标记为pv,本地包标记为pl
govendor list
列出引用该包的包 vendor包标记为pv,本地包标记为pl
govendor list -v [包链名,如:fmt、github.com/BurntSushi/toml]
##关于'+'后面的包类型的说明
状态
缩写状态
含义
+local
l
本地包,即项目自身的包组织
+external
e
外部包,即被 $GOPATH 管理,但不在 vendor 目录下
+vendor
v
已被 govendor 管理,即在 vendor 目录下
+std
s
标准库中的包
+unused
u
未使用的包,即包在 vendor 目录下,但项目并没有用到
+missing
m
代码引用了依赖包,但该包并没有找到
+program
p
主程序包,意味着可以编译为执行文件
+outside
o
外部包和缺失的包
+all
a
所有的包
##一些无法解决的问题
在移除操作的时候,有时候会出现"Error: Different Canonical Packages for ***(这里是包名)"的问题,笔者实践中出现的命令有"remove +a, remove +p",这时候json中的记录是移除了的,这时往往需要手动删除
在移除操作的时候,有时候会出现执行无效果的情况