对于任何编程语言,依赖管理都是其必须考虑的一个问题。尤其是在大规模协作的软件开发中,如何保证大家都使用同一份依赖,项目能够随时随地重复编译, 是考核编程语言成熟度的重要指标之一。一些成熟的编程语言,例如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

Reference