对于任何编程语言,依赖管理都是其必须考虑的一个问题。尤其是在大规模协作的软件开发中,如何保证大家都使用同一份依赖,项目能够随时随地重复编译, 是考核编程语言成熟度的重要指标之一。一些成熟的编程语言,例如Java、Python在这方面已经做得比较好了,但是对于新秀Golang,还要比较长的一段路要走。
GO15VENDOREXPERIMENTvendorGO15VENDOREXPERIMENT=1GO15VENDOREXPERIMENTGO15VENDOREXPERIMENT
“Through the design of the standard library, great effort was spent on controlling dependencies. It can be better to copy a little code than to pull in a big library for one function. Dependency hygiene trumps code reuse.” — Go at Google
Golang虽然已经提供vendor特性,但只是用来存储本地依赖。如何将这些依赖高效、简洁地管理起来,目前官方还没有给出明确的指导意见。只是在其官方的 Wiki Package Management Tools中列举和对比了各种依赖管理工具,其中 包括其官方的实验性的工具Dep。Dep项目开始于2016年3月,目前还处于开发和实验阶段,并没有纳入到Golang 官方的工具链中,这也是其最终目标。不过Dep只支持Go 1.8及以上版本,对于使用低于1.8版本的用户,还是需要借助Wiki中推荐的其他工具。 由于Dep是官方推出的依赖管理工具,因此备受大家的关注和期待,目前Github stars数量已经达到4800+个,下面对其进行重点介绍。
Overview
Gopkg.tomlGopkg.lockGopkg.tomlGopkg.lockGopkg.tomlGopkg.lock
Gopkg.toml语法
#
required
required
- 被项目需要
- 没有被直接或者传递import
- 不想被加入到GOPATH中,和/或者想lock它的版本
ignored
ignored
constraint
constraint
name是代码中project的import path,必须指定;branch、version、revision三者中,只能选择其中一种方式指定version。
override
overrideconstraint
version
versionconstraintoverride~=^^1.2.31.2.3 <= X < 2.0.0^0.2.30.2.3 <= X < 0.3.0
Characteristics
Dep的特性:
- 支持语义化版本和丰富的版本比较操作
- 支持从其他依赖管理工具转换
- 支持依赖树的可视化
Dep存在的不足:
- 目前速度非常慢,性能有待提升
- 快速开发迭代中,版本不稳定
Installation
MacOS上通过Homebrew安装:
go get
Usage
Start the Management
dep initdep init
vendor/_vendor-TIMESTAMP/Gopkg.tomlGopkg.lockvendor/
Add dependencies
dep ensurevendor/vendor/
Add a dependency
dep ensure -addGopkg.tomlGopkg.lockvendor/dep ensure
Update a dependency
Gopkg.tomlversion/branch/revision
Remove a dependency
dep ensure
Check status of dependency
Gopkg.tomldep statusGopkg.lockdep ensure
Troubleshooting
- Fail to checkout version
Error:
Solution:
- 传递依赖版本不符
Gopkg.tomloverride
dep init
v1.13.11c7c27d043c2a5e513a44084d2b10d77d1402b8cGopkg.toml
说明:
overriderevision