dep 是一个原型依赖管理工具,需要在 Go 1.7 及更高的版本中使用 .
安装
go get -u github.com/golang/dep/cmd/dep |
使用
老规矩,篇幅有限,我只介绍经常使用到的。 先进入在 GOPATH 的一个项目中。
cd $GOPATH/src/foordep |
初始化(dep init )
$ cd foordep/ |
大家发现了,应用 foordep 目录下出现了两个文件(Gopkg.lock 、 Gopkg.toml)和一个目录(vendor )。 它们是什么关系呢 ?
所以出现Gopkg.toml and Gopkg.lock are out of sync.
时候最好执行一下dep ensure
。
下面看看它们的内容。
cat Gopkg.lock |
cat Gopkg.toml |
dep ensure
我们写一个 Gopkg.toml 看看效果。
# 必需包 |
但是怎么样执行?可以执行如下命令寻找帮助:
$ dep help ensure |
执行一下
$ dep ensure |
错误了,这是因为 foordep 目录下没有任何的 go 代码,只能加上一个看看。
$ vim main.go |
再来试试看。
dep ensure |
看看 Gopkg.lock 的内容。
This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. |
现在需要解析 json,我们试试使用命令行的方式导入 github.com/bitly/go-simplejson 包。
$ dep ensure -add github.com/bitly/go-simplejson |
可以发现多了 github.com/bitly/go-simplejson,但是 Gopkg.toml 并没有任何改变。 注意:执行 dep ensure -add 时候报错
$ dep ensure -add github.com/bitly/go-simplejson |
还可以指定依赖的版本:
$ dep ensure -add github.com/bitly/go-simplejson@=0.4.3 |
是因为 Gopkg.toml 和 Gopkg.lock 不同步了,需要重新执行一下 dep ensure 即可。 重新整理一下 Gopkg.toml。
# 必需包 |
Gopkg.toml 的 version 规则: ~ 和 = 是 version 使用的操作符规则,如果仅仅是指定 version = “1.8.0”, 那么 dep 会自动加上 ^,表示最左边的非零位的版本加一。
^1.2.3 意味 1.2.3 <= X < 2.0.0 |
如果执行 dep ensure 时候出现
$ dep ensure |
说明配置写错了,需要看看 Gopkg.toml 文件中是不是同时配置了 version、branch 和 revision。
空配置
我们现在尝试着把 foordep 目录情况就留下 main.go
package main |
执行 dep ensure 为了更好地看到过程,加上参数 -v。
$ dep init -v |
此时再查看 Gopkg.toml 和 Gopkg.lock 文件:
$ vim Gopkg.toml |
与 glide 一样,具有自举功能,不知道这个名词用得对不对。dep 会自动根据代码生成 Gopkg.toml 和 Gopkg.lock 配置文件。 PS :但是不建议使用,因为其拉取的依赖包都是最新的,可能出现不兼容,再者我国是一个被墙的地方。
dep cache
看到这里时候很多人都会有疑问?dep 的依赖包每一次都是拉取新的还是优先使用本地 cache 呢?可以肯定的是 dep 也是有本地缓存的,大家可以打开 $GOPATH/pkg/dep/ 看看,是不是存在呢!下面我们做两个测试看看。
$GOPATH/src 不存在依赖包
环境准备,将原来的 cache 和 vendor 清空,别遗漏了 $GOPATH/src 中的 github.com/bitly/go-simplejson。
$ ll |
执行 dep init -gopath -v 查看初始化过程。
$ ll |
日志显示,dep 首先从 $GOPATH 查找 github.com/bitly/go-simplejson,因为没有找到才从网络下载。
$GOPATH 存在依赖包
环境准备,将原来的 cache 和 vendor 清空,注意 $GOPATH/src 中的 github.com/bitly/go-simplejson 存在。
$ ll |
可以看到 github.com/bitly/go-simplejson 是优先从 $GOPATH 获取的。 好处我个人认为有两个:
节省时间;本地类库的稳定性和兼容性已经经过用户验证了。在 dep v0.1 时候还不需要手动加上 -gopath 选项,dep 工具会自动判断,但是 dep v0.3 后如果没有加上 -gopath 那么默认就是从网络下载。
更新配置 (dep ensure -update) 现在修改 foordep 项目的 Gopkg.toml 内容为:
$ vim Gopkg.toml |