Golang官方依赖管理工具:dep
在这里声明一下,百度或者google看到的godep
不是我这篇博文说的dep
,那它们是什么关系呢?按照Peter Bourgon博文来说,它们的作者都有相同的人,但是一个是dep是官方版本,godep是第三方工具。
我今天介绍的是dep,之前也有介绍过glide,有兴趣的可以到Golang依赖管理工具:glide从入门到精通使用看看。 现在还有一个疑问是为什么官方现在要支持依赖管理了呢?我个人认为有如下原因(勿喷,如果不同或者遗漏欢迎留言补充):
第三方依赖管理很多,虽然很好用,但是很少可以兼容的,结果--乱;
官方的包管理为了增加社区的凝聚力,保持Go开箱即用的简单特性,不需要大家再安装各种第三方工具了,而且第三方工具都会过来兼容官方版的;
还有一个官话,为了go更好的发展;
dep的FAQ中有一段描述dep
和go get
的网址,也是侧面说了依赖管理工具和go get
关系, 一句话概括:依赖管理工具
是为应用管理代码的,go get
是为GOPATH管理代码的。
下面进入教程。
介绍dep是一个原型依赖管理工具,需要在Go 1.7及更高的版本中使用,说明第三方工具近期还是有市场的。
PS:本博客的dep
基于v0.3。
//设置环境变量使用vendor目录GO15VENDOREXPERIMENT=1安装dep
等到dep
正式集成到Golang中时候,也许是Golang 1.10 ,广大吃瓜群众就可以直接使用go dep
命令。现在还是需要自己安装的。
$goget-ugithub.com/golang/dep/cmd/dep验证安装
$depdepisatoolformanagingdependenciesforGoprojectsUsage:dep<command>Commands:initInitializeanewprojectwithmanifestandlockfilesstatusReportthestatusoftheproject'sdependenciesensureEnsureadependencyissafelyvendoredintheprojectprunePrunethevendortreeofunusedpackagesExamples:depinitsetupanewprojectdepensureinstalltheproject'sdependenciesdepensure-updateupdatethelockedversionsofalldependenciesdepensure-addgithub.com/pkg/errorsaddadependencytotheprojectUse"dephelp[command]"formoreinformationaboutacommand.
有一个很重要的选项ensure
中文含义是确保;保证;担保
,作者想传达的意思是确保所有本地状态-代码树、清单、锁和供应商彼此同步
。
看到这个说明已经安装好了。
使用老规矩,篇幅有限,我只介绍经常使用到的。 先进入在GOPATH的一个项目中。
cd$GOPATH/src/foordep初始化(dep init)
$cdfoordep/$depinit$lltotal12-rw-rw-r--1qiangmzsxqiangmzsx286Aug711:45Gopkg.lock-rw-rw-r--1qiangmzsxqiangmzsx535Aug711:45Gopkg.tomldrwxrwxr-x2qiangmzsxqiangmzsx4096Aug711:45vendor
大家发现了,应用foordep目录下出现了两个文件(Gopkg.lock、Gopkg.toml)和一个目录(vendor)。 它们是什么关系呢?
所以出现Gopkg.toml and Gopkg.lock are out of sync.
时候最好执行一下dep ensure
。
下面看看它们的内容。
$catGopkg.lock#Thisfileisautogenerated,donotedit;changesmaybeundonebythenext'depensure'.[solve-meta]analyzer-name="dep"analyzer-version=1inputs-digest="ab4fef131ee828e96ba67d31a7d690bd5f2f42040c6766b1b12fe856f87e0ff7"solver-name="gps-cdcl"solver-version=1$catGopkg.toml#Gopkg.tomlexample##Refertohttps://github.com/golang/dep/blob/master/docs/Gopkg.toml.md#fordetailedGopkg.tomldocumentation.##required=["github.com/user/thing/cmd/thing"]#ignored=["github.com/user/project/pkgX","bitbucket.org/user/project/pkgA/pkgY"]##`constraint`#name="github.com/user/project"#version="1.0.0"##`constraint`#name="github.com/user/project2"#branch="dev"#source="github.com/myfork/project2"##`override`#name="github.com/x/y"#version="2.4.0"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="qiangmzsx@hotmail.com"owners_homepage_1="https://github.com/qiangmzsx"#约束条件`constraint`name="github.com/astaxie/beego"#可选:版本version="=1.8.0"#分支#branch="master"#修订#revision="beego1.8.0"#可选:指定来源source="github.com/astaxie/beego"
但是怎么样执行?可以执行如下命令寻找帮助:
$dephelpensureUsage:depensure[-update|-add][-no-vendor|-vendor-only][-dry-run][<spec>...]Projectspec:<importpath>[:altsourceURL][@<constraint>]Ensuregetsaprojectintoacomplete,reproducible,andlikelycompilablestate:*Allnon-stdlibimportsarefulfilled*AllrulesinGopkg.tomlarerespected*Gopkg.lockrecordspreciseversionsforalldependencies*vendor/ispopulatedaccordingtoGopkg.lockEnsurehasfasttechniquestodeterminethatsomeofthesestepsmaybeunnecessary.Ifthatdeterminationismade,ensuremayskipsomesteps.Flagsmaybepassedtobypassthesechecks;-vendor-onlywillallowanout-of-dateGopkg.locktopopulatevendor/,and-no-vendorwillupdateGopkg.lock(ifneeded),butnevertouchvendor/.Theeffectofpassingprojectspecargumentsvariesslightlydependingonthecombinationofflagsthatarepassed.Examples:depensurePopulatevendorfromexistingGopkg.tomlandGopkg.lockdepensure-addgithub.com/pkg/fooIntroduceanameddependencyatitsnewestversiondepensure-addgithub.com/pkg/foo@^1.0.1IntroduceanameddependencywithaparticularconstraintFormoredetailedusageexamples,seedepensure-examples.Flags:-addaddnewdependencies,orpopulateGopkg.tomlwithconstraintsforexistingdependencies(default:false)-dry-runonlyreportthechangesthatwouldbemade(default:false)-examplesprintdetailedusageexamples(default:false)-no-vendorupdateGopkg.lock(ifneeded),butdonotupdatevendor/(default:false)-updateupdatethenameddependencies(orall,ifnonearenamed)inGopkg.locktothelatestallowedbyGopkg.toml(default:false)-venableverboselogging(default:false)-vendor-onlypopulatevendor/fromGopkg.lockwithoutupdatingitfirst(default:false)
执行一下
$depensurealldirslackedanygocode
错误了,这是因为foordep目录下没有任何的go代码,只能加上一个看看。
$vimmain.gopackagemainimport("github.com/astaxie/beego""runtime")funcmain(){maxCPU:=runtime.NumCPU()runtime.GOMAXPROCS(maxCPU)beego.Run()}
再来试试看。
$depensure$llvendor/total4drwxrwxr-x3qiangmzsxqiangmzsx4096Aug716:29github.com
看看Gopkg.lock的内容。
#Thisfileisautogenerated,donotedit;changesmaybeundonebythenext'depensure'.`projects`name="github.com/astaxie/beego"packages=[".","config","context","grace","logs","session","toolbox","utils"]revision="323a1c4214101331a4b71922c23d19b7409ac71f"source="github.com/astaxie/beego"version="v1.8.0"[solve-meta]analyzer-name="dep"analyzer-version=1inputs-digest="6fb93334da1b165aaab11f170d871a92b40033575e66e2cf4289e77e0d64551d"solver-name="gps-cdcl"solver-version=1
现在需要解析json,我们试试使用命令行的方式导入github.com/bitly/go-simplejson
包。
$depensure-addgithub.com/bitly/go-simplejson$Gopkg.lock#Thisfileisautogenerated,donotedit;changesmaybeundonebythenext'depensure'.`projects`name="github.com/astaxie/beego"packages=[".","config","context","grace","logs","session","toolbox","utils"]revision="323a1c4214101331a4b71922c23d19b7409ac71f"source="github.com/astaxie/beego"version="v1.8.0"`projects`name="github.com/bitly/go-simplejson"packages=["."]revision="aabad6e819789e569bd6aabf444c935aa9ba1e44"version="v0.5.0"[solve-meta]analyzer-name="dep"analyzer-version=1inputs-digest="6fb93334da1b165aaab11f170d871a92b40033575e66e2cf4289e77e0d64551d"solver-name="gps-cdcl"solver-version=1
可以发现多了github.com/bitly/go-simplejson
,但是Gopkg.toml
并没有任何改变。注意:执行dep ensure -add
时候报错
$depensure-addgithub.com/bitly/go-simplejsonGopkg.tomlandGopkg.lockareoutofsync.Runaplaindepensuretoresyncthembeforeattemptingto-add
还可以指定依赖的版本:
$depensure-addgithub.com/bitly/go-simplejson@=0.4.3
是因为Gopkg.toml
和Gopkg.lock
不同步了,需要重新执行一下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="qiangmzsx@hotmail.com"owners_homepage_1="https://github.com/qiangmzsx"#约束条件`constraint`name="github.com/astaxie/beego"#可选:版本version="=1.8.0"#分支#branch="master"#修订#revision="beego1.8.0"#可选:指定来源source="github.com/astaxie/beego"`constraint`name="github.com/bitly/go-simplejson"branch="master"source="https://github.com/bitly/go-simplejson.git"
Gopkg.toml
的version
规则:~
和=
是version
使用的操作符规则,如果仅仅是指定version = "1.8.0"
,那么dep
会自动加上^
,表示最左边的非零位的版本加一
。
^1.2.3意味1.2.3<=X<2.0.0^0.2.3意味0.2.3<=X<0.3.0^0.0.3意味0.0.3<=X<0.1.0
如果执行dep ensure
时候出现
$depensureerrorwhileparsing/home/users/qiangmzsx/golang/src/foordep/Gopkg.toml:multipleconstraintsspecifiedforgithub.com/astaxie/beego,canonlyspecifyone
说明配置写错了,需要看看Gopkg.toml
文件中是不是同时配置了version
、branch
和revision
。
我们现在尝试着把foordep
目录情况就留下main.go
packagemainimport("github.com/astaxie/beego""github.com/bitly/go-simplejson""runtime")funcmain(){maxCPU:=runtime.NumCPU()runtime.GOMAXPROCS(maxCPU)strJson:=`{"announcer":{"nickname":"非议讲史","kind":"user","created_at":1494904539000,"updated_at":1494983507000,"track_id":38088960}}`mapJson,_:=simplejson.NewJson([]byte(strJson))println(mapJson)beego.Run()}
执行dep ensure
为了更好地看到过程,加上参数-v
。
$depinit-vRootprojectis"foordep"1transitivelyvalidinternalpackages2externalpackagesimportedfrom2projects(0)select(root)(1)?attemptgithub.com/bitly/go-simplejsonwith1pkgs;5versionstotry(1)trygithub.com/bitly/go-simplejson@v0.5.0(1)selectgithub.com/bitly/go-simplejson@v0.5.0w/1pkgs(2)?attemptgithub.com/astaxie/beegowith1pkgs;23versionstotry(2)trygithub.com/astaxie/beego@v1.8.3(2)selectgithub.com/astaxie/beego@v1.8.3w/9pkgsfoundsolutionwith10packagesfrom2projectsSolverwalltimesbysegment:b-list-versions:3.926086724sb-list-pkgs:285.209471msb-gmal:266.828805msselect-atom:3.417834mssatisfy:3.126864msselect-root:428.276μsnew-atom:234.106μsother:45.014μsb-source-exists:6.946μsb-deduce-proj-root:3.472μsTOTAL:4.485387512sUsing^0.5.0asconstraintfordirectdepgithub.com/bitly/go-simplejsonLockinginv0.5.0(aabad6e)fordirectdepgithub.com/bitly/go-simplejsonUsing^1.8.3asconstraintfordirectdepgithub.com/astaxie/beegoLockinginv1.8.3(cab8458)fordirectdepgithub.com/astaxie/beego
此时再查看Gopkg.toml
和Gopkg.lock
文件:
$vimGopkg.toml`constraint`name="github.com/astaxie/beego"version="1.8.3"`constraint`name="github.com/bitly/go-simplejson"version="0.5.0"$vimGopkg.lock`projects`name="github.com/astaxie/beego"packages=[".","config","context","context/param","grace","logs","session","toolbox","utils"]revision="cab8458c1c4a5a3b4bf5192922be620e6dede15b"version="v1.8.3"`projects`name="github.com/bitly/go-simplejson"packages=["."]revision="aabad6e819789e569bd6aabf444c935aa9ba1e44"version="v0.5.0"[solve-meta]analyzer-name="dep"analyzer-version=1inputs-digest="dc040fb12390d61768be6388ad2935bdd7f9cc93d4b1fdda421a284058277c80"solver-name="gps-cdcl"solver-version=1
与glide
一样,具有自举
功能,不知道这个名词用得对不对。dep
会自动根据代码生成Gopkg.toml
和Gopkg.lock
配置文件。
PS:但是不建议使用,因为其拉取的依赖包都是最新的,可能出现不兼容,再者我国是一个被墙
的地方。
看到这里时候很多人都会有疑问?dep
的依赖包每一次都是拉取新的还是优先使用本地cache呢?可以肯定的是dep
也是有本地缓存的,大家可以打开$GOPATH/pkg/dep/
看看,是不是存在呢!
下面我们做两个测试看看。
环境准备,将原来的cache和vendor清空,别遗漏了$GOPATH/src
中的github.com/bitly/go-simplejson
。
$lltotal4-rwxr--r--1qiangmzsxqiangmzsx990Aug716:39main.go$vimmain.gopackagemainimport("github.com/astaxie/beego""github.com/bitly/go-simplejson""runtime")funcmain(){maxCPU:=runtime.NumCPU()runtime.GOMAXPROCS(maxCPU)strJson:=`{"announcer":{"nickname":"非议讲史","kind":"user","updated_at":1494983507000,"track_id":38088960}}`mapJson,_:=simplejson.NewJson([]byte(strJson))println(mapJson)beego.Run()}
执行dep init -gopath -v
查看初始化过程。
$lltotal4-rwxr--r--1qiangmzsxqiangmzsx382Aug812:47main.go$depinit-gopath-vSearchingGOPATHforprojects...FollowingdependencieswerenotfoundinGOPATH.Depwillusethemostrecentversionsoftheseprojects.github.com/bitly/go-simplejsonRootprojectis"foordep"1transitivelyvalidinternalpackages2externalpackagesimportedfrom2projects(0)select(root)(1)?attemptgithub.com/astaxie/beegowith1pkgs;atleast1versionstotry(1)trygithub.com/astaxie/beego@76ce912a30f9255d8d353d365ab99cb069fd29e0(1)Unabletoupdatecheckedoutversion:fatal:referenceisnotatree:76ce912a30f9255d8d353d365ab99cb069fd29e0(1)trygithub.com/astaxie/beego@v1.8.3(1)selectgithub.com/astaxie/beego@v1.8.3w/9pkgs(2)?attemptgithub.com/bitly/go-simplejsonwith1pkgs;5versionstotry(2)trygithub.com/bitly/go-simplejson@v0.5.0(2)selectgithub.com/bitly/go-simplejson@v0.5.0w/1pkgsfoundsolutionwith10packagesfrom2projectsSolverwalltimesbysegment:b-list-pkgs:320.955115msb-gmal:274.950203mssatisfy:8.179966msselect-atom:2.62224msnew-atom:392.168μsb-list-versions:254.937μsselect-root:209.152μsb-deduce-proj-root:40.45μsother:37.01μsb-source-exists:5.83μsTOTAL:607.647071msUsing^1.8.3asconstraintfordirectdepgithub.com/astaxie/beegoLockinginv1.8.3(cab8458)fordirectdepgithub.com/astaxie/beegoUsing^0.5.0asconstraintfordirectdepgithub.com/bitly/go-simplejsonLockinginv0.5.0(aabad6e)fordirectdepgithub.com/bitly/go-simplejson
日志显示,dep
首先从$GOPATH查找github.com/bitly/go-simplejson
,因为没有找到才从网络下载。
环境准备,将原来的cache和vendor清空,注意$GOPATH/src
中的github.com/bitly/go-simplejson
存在。
$lltotal4-rwxr--r--1qiangmzsxqiangmzsx382Aug812:47main.go$depinit-gopath-vSearchingGOPATHforprojects...Usingmasterasconstraintfordirectdepgithub.com/bitly/go-simplejsonLockinginmaster(da1a892)fordirectdepgithub.com/bitly/go-simplejsonRootprojectis"foordep"1transitivelyvalidinternalpackages2externalpackagesimportedfrom2projects(0)select(root)(1)?attemptgithub.com/astaxie/beegowith1pkgs;atleast1versionstotry(1)trygithub.com/astaxie/beego@76ce912a30f9255d8d353d365ab99cb069fd29e0(1)Unabletoupdatecheckedoutversion:fatal:referenceisnotatree:76ce912a30f9255d8d353d365ab99cb069fd29e0(1)trygithub.com/astaxie/beego@v1.8.3(1)selectgithub.com/astaxie/beego@v1.8.3w/9pkgs(2)?attemptgithub.com/bitly/go-simplejsonwith1pkgs;atleast1versionstotry(2)trygithub.com/bitly/go-simplejson@master(2)selectgithub.com/bitly/go-simplejson@masterw/1pkgsfoundsolutionwith10packagesfrom2projectsSolverwalltimesbysegment:b-list-pkgs:312.646734msb-gmal:265.066047mssatisfy:6.488056msselect-atom:3.287416msnew-atom:397.837μsselect-root:373.267μsb-list-versions:108.466μsother:47.43μsb-source-exists:7.71μsb-deduce-proj-root:6.568μsTOTAL:588.429531msUsing^1.8.3asconstraintfordirectdepgithub.com/astaxie/beegoLockinginv1.8.3(cab8458)fordirectdepgithub.com/astaxie/beego
可以看到github.com/bitly/go-simplejson
是优先从$GOPATH
获取的。 好处我个人认为有两个:
节省时间;
本地类库的稳定性和兼容性已经经过用户验证了。
在dep v0.1
时候还不需要手动加上-gopath
选项,dep
工具会自动判断,但是dep v0.3
后如果没有加上-gopath
那么默认就是从网络下载。
现在修改foordep
项目的Gopkg.toml
内容为:
$vimGopkg.toml`constraint`name="github.com/astaxie/beego"#约束为1.8.0version="=1.8.0"`constraint`name="github.com/bitly/go-simplejson"version="0.5.0"$depensure-updateGopkg.tomlandGopkg.lockareoutofsync.Runaplaindepensuretoresyncthembeforeattemptingto-update$depensure$depensure-update-vRootprojectis"foordep"1transitivelyvalidinternalpackages2externalpackagesimportedfrom2projects(0)select(root)(1)?attemptgithub.com/astaxie/beegowith1pkgs;23versionstotry(1)trygithub.com/astaxie/beego@v1.8.3(2)github.com/astaxie/beego@v1.8.3notallowedbyconstraint1.8.0:(2)1.8.0from(root)(1)trygithub.com/astaxie/beego@v1.8.2(2)github.com/astaxie/beego@v1.8.2notallowedbyconstraint1.8.0:(2)1.8.0from(root)(1)trygithub.com/astaxie/beego@v1.8.1(2)github.com/astaxie/beego@v1.8.1notallowedbyconstraint1.8.0:(2)1.8.0from(root)(1)trygithub.com/astaxie/beego@v1.8.0(1)selectgithub.com/astaxie/beego@v1.8.0w/8pkgs(2)?attemptgithub.com/bitly/go-simplejsonwith1pkgs;5versionstotry(2)trygithub.com/bitly/go-simplejson@v0.5.0(2)selectgithub.com/bitly/go-simplejson@v0.5.0w/1pkgsfoundsolutionwith9packagesfrom2projectsSolverwalltimesbysegment:b-source-exists:4.00794324sb-list-pkgs:2.545452669sb-gmal:276.070372mssatisfy:5.179016msselect-atom:4.337704msnew-atom:1.359055msb-list-versions:467.799μsb-matches:371.239μsselect-root:193.471μsb-pair-rev:127.992μsother:25.962μsb-pair-version:7.866μsTOTAL:6.841536385s$depstatusPROJECTCONSTRAINTVERSIONREVISIONLATESTPKGSUSEDgithub.com/astaxie/beego1.8.0v1.8.0323a1c4323a1c48github.com/bitly/go-simplejson^0.5.0v0.5.0aabad6eaabad6e1后记
看到了这里,那么对dep
已经可以进行基本的使用了,不过目前而言,dep
还不够稳定,谁也不知道后续会怎么样更改,尝鲜可以,个人还不建议使用在线上。 如果大家喜欢这篇博文请点赞
或者留言
,有不同见解的也请留言
讨论。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。