Go语言程序组织和构建的基本单元是Package,但Go语言官方却没有提供一款“像样的”Package Management Tool(包管理工具)。 随着Go语言在全球范围内应用的愈加广泛,缺少官方包管理工具这一问题变得日益突出。
2016年GopherCon大会后,在Go官方的组织下,一个旨在改善Go包管理的commitee成立了,共同应对Go在package management上遇到的各种问题。 经过各种脑洞和讨论后,该commitee在若干月后发布了“Package Management Proposal”, 并启动了最有可能被接纳为官方包管理工具的项目dep的设计和开发。2017年年初,dep项目正式对外开放。截至目前,dep发布了v0.1.0版本,并处于alpha测试阶段。
使用之前,首先安装 glide 参考 glide 官网
- glide create|init 初始化项目并创建glide.yaml文件.
- glide get 获取单个包 --all-dependencies 会下载所有关联的依赖包 -s 删除所有版本控制,如.git -v 删除嵌套的vendor
- glide install 安装包
- glide update|up 更新包
glide采用 glide.yaml 和 glide.lock 进行版本控制,所有的包管理都在 vendor目录下。 glide.lock文件是自己生成的,不要动。 如果只需要引用项目的其中一部分或者是项目的某一个版本,在glide.yaml文件下修改。
package: glide_demo6
import:
- package: github.com/mattn/go-adodb
- package: github.com/go-ole/go-ole
当配置好如上文件之后, 执行 glide install
即可获取。
- 第三方依赖管理很多,虽然很好用,但是很少可以兼容的,结果--乱;
- dep 是官方推荐的 go 包管理工具,在 tidb 项目中使用过,推荐使用。与glide 有异曲同工之妙。
- 概括: 依赖管理工具是为应用管理代码的,go get是为 GOPATH 管理代码的
- 环境准备
设置环境变量 使用vendor目录GO15VENDOREXPERIMENT=1
- 安装 dep
$ go get -u github.com/golang/dep/cmd/dep
目前为止需要手动安装。1.10 之后可能直接使用go dep
- 验证安装
$ dep
dep is a tool for managing dependencies for Go projectsUsage: dep <command>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.
** 先进入在 GOPATH 的一个项目中。**
cd $GOPATH/src/testGo
- 初始化(dep init) 应用 testGo 目录下出现了两个文件(Gopkg.lock、Gopkg.toml)和一个目录(vendor)
注意:当出现 Gopkg.toml and Gopkg.lock are out of sync.时候最好执行一下 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 = "[email protected]"owners_homepage_1 = "https://github.com/qiangmzsx"# 约束条件[[constraint]]
name = "github.com/astaxie/beego"
# 可选:版本
version = "=1.8.0"
# 分支
#branch = "master"
# 修订
#revision = "beego 1.8.0"
# 可选:指定来源
source = "github.com/astaxie/beego"
- 还可以指定依赖的版本:
$ dep ensure -add github.com/bitly/go-simplejson@=0.4.3
预警:
假设发现 Gopkg.toml和 Gopkg.lock 不同步了,需要重新执行一下 dep ensure
即可
-
当执行 dep ensure 时候出错,说明配置写错了,需要看看Gopkg.toml文件中是不是同时配置了version、branch和revision。
-
执行dep ensure 为了更好地看到过程,加上参数-v。
-
dep会自动根据代码生成Gopkg.toml和Gopkg.lock配置文件。
PS:但是不建议使用,因为其拉取的依赖包都是最新的,可能出现不兼容,再者我国是一个被墙的地方。
- dep cache
dep也是有本地缓存的,大家可以打开 $GOPATH/pkg/dep/ 看看
好处有两个
-
节省时间;
-
本地类库的稳定性和兼容性已经经过用户验证了。
-
更新配置 (dep ensure -update)
update:
which dep 2>/dev/null || go get -u github.com/golang/dep/cmd/dep
ifdef PKG
dep ensure -add ${PKG}
else
dep ensure -update
endif
@echo "removing test files"
dep prune
bash ./hack/clean_vendor.sh
glide 也好 dep 也罢,掌握他们吧主要是学会写他们对应的版本管理文件。
dep 属于go官方亲生,所以个人建议使用 dep 更为稳妥一点,这一点采纳tidb 内部最后将 glide 替换为 dep 的做法。