golang中的包管理工具之govendor

为什么用vendor目录
依赖问题
我们知道,一个工程稍大一点,通常会依赖各种各样的包。而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本。而不同的依赖包由各自的版本工具独立管理,所以当所依赖的包在新版本发生接口变更或删除时,会面临很多问题。
为避免此类问题,我们可能会为不同的工程设置不同的GOPATH,或者更改依赖包路径名称。这样手动维护起来也很头疼。

解决方式
如果我们已经使用GOPATH去存储packages了,问什么还需要使用vendor目录呢?这是为了解决同一个包不同版本之间依赖问题。
假如多个应用使用一个依赖包的不同版本?这个问题不只是Go应用,其他语言也会有这个问题。
vendor目录允许不同的代码库拥有它自己的依赖包,并且不同于其他代码库的版本,这就很好的做到了工程的隔离。

常用的依赖包管理工具有godep,govendor等,这里选择vendor作为golang中的包管理工具。
Go 1.5引入了vendor文件夹,其对语言使用,go命令没有任何影响。若某个路径下边包含vendor文件夹,则在某处引用包时,会优先搜索vendor文件夹下的包。
在Go 1.5开启该项特性需设置GO15VENDOREXPERIMENT=1,而从Go 1.6开始,该项特性默认开启。vendor在go build时能够将应用搜索路径调整成为 “当前项目目录/vendor目录”的方式。通过这种形式,可以实现类似于 godep 方式的项目依赖管理。

注意:即使在项目中已经使用了vendor,该项目及vendor文件夹路径也必须在GOPATH中。在go项目及其工具链中,目前是逃不掉GOPATH的。

安装与简单使用
安装
使用go get命令即可实现快速安装。

go get -u github.com/kardianos/govendor
1
使用说明
#进入到项目目录
cd /Users/username/go/src/goproject

#初始化vendor目录
govendor init

#使用ls查看goproject项目下的目录,可以看到已经生成了vendor目录
ls
cache cmd comman database main.go model service utils vendor #这里是ls命令返回的结果

#vendor会将GOPATH中本工程使用到的依赖包自动移动到vendor目录中
#说明:如果本地GOPATH没有依赖包,先go get安装相应的依赖包,然后使用下面命令添加进vendor目录
govendor add +external 或使用缩写: govendor add +e

#Go1.6以上版本默认开启 GO15VENDOREXPERIMENT 环境变量,可忽略下面的步骤。
#Go1.5通过设置环境变量 GO15VENDOREXPERIMENT=1 使用vendor文件夹构建文件。
#可以选择 export GO15VENDOREXPERIMENT=1 或 GO15VENDOREXPERIMENT=1 go build 执行编译
export GO15VENDOREXPERIMENT=1
 
govendor只是用来管理项目的依赖包,如果GOPATH中本身没有项目的依赖包,则需要通过go get先下载到GOPATH中,再通过govendor add +external拷贝到vendor目录中。Go 1.6以上版本默认开启GO15VENDOREXPERIMENT环境变量。

命令使用
常见的命令如下,格式为 govendor COMMAND。
命令 功能

命令 功能
init 初始化 vendor 目录
list 列出所有的依赖包
add 添加包到 vendor 目录,如 govendor add +external 添加所有外部包
add PKG_PATH 添加指定的依赖包到 vendor 目录
get 类似 go get 命令,拉取依赖包到 vendor 目录
update 从 $GOPATH 更新依赖包到 vendor 目录
remove 从 vendor 管理中删除依赖
status 列出所有缺失、过期和修改过的包
fetch 添加或更新包到本地 vendor 目录
sync 本地存在 vendor.json 时候拉取依赖包,匹配所记录的版本
migrate 从原有工具中移动包到带有元数据的vendor文件夹
一些命令的缩写形式


使用规约
使用vendor时,建议遵循如下两条规约。
a) 当欲将某包vendor时,可能想将所有依赖包均vendor;
b) 尽量将vendor依赖包结构扁平化,不要vendor套vendor。
如下示例代码演示vendor扁平化使用。
main.go位于$GOPATH/src/github.com/olzhy/test下。

package main

import (
"strings"
"sync"
"time"

"github.com/z"
"github.com/y"
"golang.org/z"
)
...
 
$GOPATH/src/github.com/olzhy/test目录树。

├─ main.go
└─ vendor
├─ github.com
│ ├─ x
│ └─ y
└─ golang.org
└─ z
————————————————
版权声明:本文为CSDN博主「love666666shen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/love666666shen/article/details/88944318

posted @ 2022-06-02 01:47  jinzi  阅读(10)  评论(0编辑  收藏  举报