golang工程的依赖包经常使用go get命令来获取,例如:go get github.com/kardianos/govendor ,会将依赖包下载到GOPATH
的路径下。常用的依赖包管理工具有godep
,govendor
等,在Golang1.5之后,Go提供了 GO15VENDOREXPERIMENT
环境变量(Go 1.6版本默认开启该环境变量),用于将go build时的应用路径搜索调整成为 当前项目目录/vendor
目录方式。通过这种形式,我们可以实现类似于 godep
方式的项目依赖管理。
go get -u -v github.com/kardianos/govendor
#进入到项目目录
cd /home/gopath/src/myproject
#初始化vendor目录
govendor init
#查看vendor目录
[root@CC32225A myproject]# ls
commands main.go vendor myproject_test.sh
#将GOPATH中本工程使用到的依赖包自动移动到vendor目录中
#说明:如果本地GOPATH没有依赖包,先go get相应的依赖包
govendor add +external
或使用缩写: govendor add +e
#Go 1.6以上版本默认开启 GO15VENDOREXPERIMENT 环境变量,可忽略该步骤。
#通过设置环境变量 GO15VENDOREXPERIMENT=1 使用vendor文件夹构建文件。
#可以选择 export GO15VENDOREXPERIMENT=1 或 GO15VENDOREXPERIMENT=1 go build 执行编译
export GO15VENDOREXPERIMENT=1
此时看到的vendor.json文件就比之前多了许多,例如:
{
"comment": "",
"ignore": "test",
"package": [
{
"checksumSHA1": "aQFLbMaXYrtdgLlR2m+DaZwz4WM=",
"path": "github.com/Lofanmi/pinyin-golang/pinyin",
"revision": "30cdbfc8c2de3b2efb359b8d95631229eec88ffb",
"revisionTime": "2018-08-08T03:00:53Z"
},
{
"checksumSHA1": "PLYRsSaqhSKrGIuxWkV+B9uMUL8=",
"path": "github.com/alecthomas/log4go",
"revision": ""
},
{
"checksumSHA1": "a9Sq/X9bS1l5EA7KfRmtw4lMedY=",
"path": "github.com/astaxie/beego",
"revision": ""
},
{
"checksumSHA1": "zgHK1vxUJDZTXAPCw+Bls7St0Ks=",
"path": "github.com/astaxie/beego/config",
"revision": ""
},
....
{
"checksumSHA1": "REkmyB368pIiip76LiqMLspgCRk=",
"path": "golang.org/x/sys/cpu",
"revision": "ec910dc1c36d683f77d2db63b82474261f0ac140",
"revisionTime": "2018-09-10T02:23:21Z"
},
{
"checksumSHA1": "gq+MtaxaV8I0Nl19Vdvy4yhRJOE=",
"path": "golang.org/x/sys/unix",
"revision": "ec910dc1c36d683f77d2db63b82474261f0ac140",
"revisionTime": "2018-09-10T02:23:21Z"
},
{
"checksumSHA1": "Y7nctMxT58lRM78VtElPerhcnEs=",
"path": "golang.org/x/sys/windows",
"revision": "ec910dc1c36d683f77d2db63b82474261f0ac140",
"revisionTime": "2018-09-10T02:23:21Z"
},
{
"checksumSHA1": "i3wCya26lOLhEfq0EyzriGrQ35s=",
"path": "golang.org/x/time/rate",
"revision": "ec910dc1c36d683f77d2db63b82474261f0ac140",
"revisionTime": "2018-09-10T02:23:21Z"
},
{
"checksumSHA1": "oQQwx8g3cICuxaXaogTf1nr027E=",
"path": "gopkg.in/asn1-ber.v1",
"revision": "379148ca0225df7a432012b8df0355c2a2063ac0",
"revisionTime": "2017-05-11T16:59:59Z"
},
{
"checksumSHA1": "BYJlm+iDc2MDCVUy6eITxw3IeOU=",
"path": "gopkg.in/gomail.v2",
"revision": "81ebce5c23dfd25c6c67194b37d3dd3f338c98b1",
"revisionTime": "2016-04-11T21:29:32Z"
},
{
"checksumSHA1": "ZxVlaB3g5rPylGFPXk0id4j4R10=",
"path": "gree/common/security",
"revision": ""
}
],
"rootPath": "myproject"
}
govendor list可以快速查看你项目中的外部依赖包。例如:
v github.com/astaxie/beego
v github.com/astaxie/beego/cache
v github.com/astaxie/beego/cache/redis
v github.com/astaxie/beego/config
v github.com/astaxie/beego/context
v github.com/astaxie/beego/context/param
v github.com/astaxie/beego/grace
l benben-project/router
l benben-project/config
l benben-project/controllers
l benben-project/log
l benben-project/models
其中最左边的是描述包的状态,右边是你工程的依赖包
govendor add添加依赖包到vendor目录下,在使用 govendor add命令时,后面需要跟上下面介绍的一些状态,也可以直接跟上缺失包的地址,如下文常见错误中的做法。
govendor update从你的GOPAHT中更新你工程的依赖包
govendor remove从你工程下的vendor文件中移除对应的包
govendor fetch添加或者更新vendor文件夹中的包
govendor使用状态来指定包
其中有一些状态存在简写,例如:+std可以用+s表示,+external可以用+ext或者+e表示,+external可以用+exc或者+x表示。
在使用时,你也可以对这些状态进行逻辑组合,例如:
+local,grogram表示既满足+local又满足+program。
+local +vendor表示只要满足两者之一。
+vendor,program +std表示vendor和program是与的关系,整体和std是或的关系
+vendor,^program表示满足vendor,但却不满足program。
3.常见错误
1. 服务器提示某个依赖包没有找到
原因可能是vendor文件中没有该包或者vendor.json文件中没有该包的描述信息。假设"github.com/astaxie/beego/logs"包的信息在vendor.json文件中没有找到,则在go命令行中执行govendor add github.com/astaxie/beego/logs。