
在这里声明一下,百度或者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)。 它们是什么关系呢?
650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" alt="关系" src="https://gss0.baIDu.com/9rkZbzqaKgQUohGko9WTAnF6hhy/mms-res/voice/choujiang/28968009-f49a4a6a-78eb-11e7-93cf-e695d45488da.14d8c0f3.png">
所以出现
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,"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=[".","context/param","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":"非议讲史",_:=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还不够稳定,谁也不知道后续会怎么样更改,尝鲜可以,个人还不建议使用在线上。 如果大家喜欢这篇博文请点赞或者留言,有不同见解的也请留言讨论。
以上是内存溢出为你收集整理的Golang官方依赖管理工具:dep全部内容,希望文章能够帮你解决Golang官方依赖管理工具:dep所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)