以写作调身心

Go vendor应用

为什么要用它

控制包的依赖,例如一个项目引用的是A包1.0版本后编译成功,结果几个月后A包tag号升到了2.3,而我们平时用go get命令是直接从master分支下引入的,因此可能会造成引入了同样的包,但编译不通过的问题。
而如果这个项目中存在vendor文件夹,go项目编译时就会优先编译vendor文件夹里的包。

问题还原

今天编译一个用Go写的语音识别服务的项目,缺失的A包用go get命令获取了,但编译后显示xxx function not defined,而我查了这个xxx函数是A包声明好的,这是什么原因呢。
原因就在于版本不匹配

解决

简单直接的方法

在该项目下新建一个vendor文件夹,假如这个包是引入github上的,就在这下面建立基于github的路径,像这样

.
├── 20hours
│   ├── 20hours
│   ├── demo.txt
│   ├── file.png
│   └── main.go
├── testgo
├── test.go
└── vendor
    └── github.com
        └── name
            └── A

获取包的指定版本号仓库文件,可以用命令

git clone v版本号 httpurl  

举例:获取版本号为1.4.1的go-socket.io包  
git clone v1.4.1 https://github.com/googollee/go-socket.io

推荐的方法,使用dep构建

网上教程很多,在此不做赘述

评论