在21章中,介绍了官方go get的缺陷。go get最主要的问题是没有版本号的概念。每次拉取的都是master分支。
本章将介绍下,一个github上开源的包管理项目:Godep。github地址为:
该工具可以将项目中所依赖的第3方库,以及版本号保存到名为Godeps.json的json文件中。并可以根据Godeps.json文件,拉取所有依赖库。
生成的Godeps.json,类似下面的格式:
{
"ImportPath": "github.com/fananchong/go-x",
"GoVersion": "go1.8",
"GodepVersion": "v79",
"Packages": [ "./..." ],
"Deps": [ { "ImportPath": "github.com/bitly/go-simplejson", "Comment": "v0.5.0-8-g0c96595", "Rev": "0c965951289cce37dec52ad1f34200fefc816777" }, { "ImportPath": "github.com/fananchong/gochart", "Comment": "v2.0-14-g9caf047", "Rev": "9caf047dcbf244db0802dba9af4284363e429b7f" }, { "ImportPath": "github.com/fananchong/gonet", "Comment": "17.09.09-9-gb0448f0", "Rev": "b0448f0c0d628399975c332b15ab0e254c9ed3fc" }, { "ImportPath": "github.com/golang/glog", "Rev": "23def4e6c14b4da8ac2ed8007337bc5eb5007998" } ] }
在没有该工具前,通常go程序员都会自己编写个go get脚本,保存第3方依赖库信息。
go get脚本格式会类似这样:
set GOPATH=%~dp0
go get -u -d google.golang.org/grpc/...
go get -u -d github.com/coreos/etcd/clientv3/...
go get -u -d github.com/fananchong/go-discovery/...
cd %GOPATH%/src/github.com/coreos/etcd/clientv3
git checkout --no-track -B Branch_v3.2.9 v3.2.9 --
cd %GOPATH%/src/google.golang.org/grpc
git checkout --no-track -B Branch_v1.5.2 v1.5.2 --
cd %GOPATH%
通过 go get 以及 git checkout ,来保证下载正确的版本。
这样做的效果和 Godep本质上没有什么差别。
相比一下,使用 Godep 的好处主要有以下几点:
- 显的逼格高点
- 通过Godeps.json文件描述,依赖库一目了然
- 依赖库最小集。通常自己写go get脚本很难做到最小集下载
- 不需要自己查看并记录所使用的依赖库的版本号
可以参考本人github上go-x下的例子:
go-x/Godeps/gen.bat脚本为根据Godeps.json文件拉取第3方依赖库
go-x/Godeps/save.bat脚本为保存当前第3方依赖库信息到Godeps.json文件中
go-x项目拉取后,执行gen.bat,拉取第3方依赖库;第3方依赖库在go-x/Godeps/src中变更后,则执行save.bat,保存最新的第3方依赖库信息到Godeps.json文件
脚本内容如下:
rd /q /s src
set GOPATH=%~dp0
cd %GOPATH%\..
%GOPATH%\..\tool\godep\godep.exe restore
pause
脚本内容如下:
rd /q /s D:\tmp
mkdir D:\tmp
move /y src D:\tmp\src
set CURDIR=%~dp0
set BASEDIR=%~dp0
set BASEDIR=%BASEDIR:\src\github.com\fananchong\go-x\Godeps\=\%
set GOPATH=%BASEDIR%;D:\tmp
cd %CURDIR%\..
.\tool\godep\godep.exe save -v ./...
rd /q /s vendor
cd %CURDIR%
gen.bat