organizing golang projects and dependencies

背景

golang的依赖一直是让人头疼的问题, 大家对其自有的package管理也是褒贬不一
而对于一个公司内部项目来讲, 主要的需求有以下几点

  1. 方便的依赖包版本管理
  2. 方便协同开发
  3. 尽可能不依赖其编译所在环境
  4. 除基础包之外, 第三方包尽可能的自包含

基于此, 有了本文, 打算以最小的环境变更及工具, 打造一个可协同工作的golang projects

依赖工具

优势

  • 不依赖默认GOPATH,只需设置GOPATH为当前目录及指定子目录即可。即项目无需放在默认$GOPATH下面
  • 经测试支持go 1.5, go1.6, go1.7
    • go 1.5需unset GO15VENDOREXPERIMENT或者设置GO15VENDOREXPERIMENT=1
  • 不依赖GOROOT
    • 当然使用godef等工具还是需要设置GOROOT的

项目创建者

1
2
3
4
5
6
export GOPATH=$PWD:$PWD/deps
mkdir -p deps
ln -sf ../vendor deps/src
glide init --non-interactive
glide install

项目协同者

1
2
git clone
glide install

依赖已有的包

可能一些包你已经下载过了,例如golang.org/x/ 下的一系列包,不想再辛苦重新下载,可以使用glide mirrors,然后再glide install即可

1
2
glide mirror set https://gopkg.in/go-playground/validator.v8 file:///path/to/gopkg.in/go-playground/validator.v8 --vcs git
glide mirror set https://gopkg.in/yaml.v2 file:///path/to/gopkg.in/yaml.v2 --vcs git

锁定依赖包的版本

当执行glide up时,glide的思路是更新你项目的所有依赖到最新版本。这个结果往往不是我们想要的,生产环境中往往只是依赖一个稳定的版本。
glide-pin 是一个glide的插件,提供了从lock文件转换成yaml文件的功能。
可以利用这个工具,生成具有具体版本的glide.yaml文件,就能达到锁定依赖包版本的目的。

-EOF-