在这里声明一下,百度或者google看到的godep不是我这篇博文说的dep,那它们是什么关系呢?按照Peter Bourgon博文来说,它们的作者都有相同的人,但是一个是dep是官方版本,godep是第三方工具。
我今天介绍的是dep,之前也有介绍过glide,有兴趣的可以到Golang依赖管理工具:glide从入门到精通使用看看。 现在还有一个疑问是为什么官方现在要支持依赖管理了呢?我个人认为有如下原因(勿喷,如果不同或者遗漏欢迎留言补充):第三方依赖管理很多,虽然很好用,但是很少可以兼容的,结果--乱;
官方的包管理为了增加社区的凝聚力,保持Go开箱即用的简单特性,不需要大家再安装各种第三方工具了,而且第三方工具都会过来兼容官方版的;
还有一个官话,为了go更好的发展;
dep的FAQ中有一段描述dep和go get 的网址,也是侧面说了依赖管理工具和go get关系, 一句话概括:依赖管理工具是为应用管理代码的,go get是为GOPATH管理代码的。
下面进入教程。
介绍
dep是一个原型依赖管理工具,需要在Go 1.7及更高的版本中使用,说明第三方工具近期还是有市场的。
PS:本博客的dep基于v0.3。
安装
环境准备。//设置环境变量 使用vendor目录GO15VENDOREXPERIMENT=1
安装dep
等到dep正式集成到Golang中时候,也许是Golang 1.10 ,广大吃瓜群众就可以直接使用go dep命令。现在还是需要自己安装的。$ go get -u github.com/golang/dep/cmd/dep
验证安装$ depdep is a tool for managing dependencies for Go projectsUsage: dep Commands: init Initialize a new project with manifest and lock files status Report the status of the project's dependencies ensure Ensure a dependency is safely vendored in the project prune Prune the vendor tree of unused packagesExamples: dep init set up a new project dep ensure install the project's dependencies dep ensure -update update the locked versions of all dependencies dep ensure -add github.com/pkg/errors add a dependency to the projectUse "dep help [command]" for more information about a command.
有一个很重要的选项ensure中文含义是确保;保证;担保,作者想传达的意思是确保所有本地状态-代码树、清单、锁和供应商彼此同步。
看到这个说明已经安装好了。
使用
老规矩,篇幅有限,我只介绍经常使用到的。 先进入在GOPATH的一个项目中。cd $GOPATH/src/foordep
初始化(dep init)$ cd foordep/$ dep init$ lltotal 12-rw-rw-r-- 1 qiangmzsx qiangmzsx 286 Aug 7 11:45 Gopkg.lock-rw-rw-r-- 1 qiangmzsx qiangmzsx 535 Aug 7 11:45 Gopkg.tomldrwxrwxr-x 2 qiangmzsx qiangmzsx 4096 Aug 7 11:45 vendor
大家发现了,应用foordep目录下出现了两个文件(Gopkg.lock、Gopkg.toml)和一个目录(vendor)。 它们是什么关系呢?
所以出现Gopkg.toml and Gopkg.lock are out of sync.时候最好执行一下dep ensure。
下面看看它们的内容。$ cat Gopkg.lock # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.[solve-meta] analyzer-name = "dep" analyzer-version = 1 inputs-digest = "ab4fef131ee828e96ba67d31a7d690bd5f2f42040c6766b1b12fe856f87e0ff7" solver-name = "gps-cdcl" solver-version = 1$ cat Gopkg.toml # Gopkg.toml example## Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md# for detailed Gopkg.toml documentation.## required = ["github.com/user/thing/cmd/thing"]# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]## `constraint`# name = "github.com/user/project"# version = "1.0.0"## `constraint`# name = "github.com/user/project2"# branch = "dev"# source = "github.com/myfork/project2"## `override`# name = "github.com/x/y"# version = "2.4.0"
dep ensure
我们写一个Gopkg.toml看看效果。# 必需包required = ["github.com/astaxie/beego"]# 忽略包ignored = ["golang.org/x/crypto"]# 项目元数据[metadata]homepage = "https://github.com/qiangmzsx"license = "MIT"owners_name_1 = "qiangmzsx"owners_email_1 = "qiangmzsx@hotmail.com"owners_homepage_1 = "https://github.com/qiangmzsx"# 约束条件`constraint` name = "github.com/astaxie/beego" # 可选:版本 version = "=1.8.0" # 分支 #branc