Golang官方依赖管理工具:dep

前端之家收集整理的这篇文章主要介绍了Golang官方依赖管理工具:dep前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在这里声明一下,百度或者google看到的godep不是我这篇博文说的dep,那它们是什么关系呢?按照Peter Bourgon博文来说,它们的作者都有相同的人,但是一个是dep是官方版本,godep是第三方工具。
我今天介绍的是dep,之前也有介绍过glide,有兴趣的可以到Golang依赖管理工具:glide从入门到精通使用看看。 现在还有一个疑问是为什么官方现在要支持依赖管理了呢?我个人认为有如下原因(勿喷,如果不同或者遗漏欢迎留言补充):

  • 第三方依赖管理很多,虽然很好用,但是很少可以兼容的,结果--乱;

  • 官方的包管理为了增加社区的凝聚力,保持Go开箱即用的简单特性,不需要大家再安装各种第三方工具了,而且第三方工具都会过来兼容官方版的;

  • 还有一个官话,为了go更好的发展;
    dep的FAQ中有一段描述depgo get网址,也是侧面说了依赖管理工具和go get关系, 一句话概括:依赖管理工具是为应用管理代码的,go get是为GOPATH管理代码的。

下面进入教程。

介绍

dep是一个原型依赖管理工具,需要在Go 1.7及更高的版本中使用,说明第三方工具近期还是有市场的。
PS:本博客dep基于v0.3。

安装

环境准备。

//设置环境变量使用vendor目录GO15VENDOREXPERIMENT=1
@H_301_49@安装dep

等到dep正式集成到Golang中时候,也许是Golang 1.10 ,广大吃瓜群众就可以直接使用go dep命令。现在还是需要自己安装的。

$goget-ugithub.com/golang/dep/cmd/dep

验证安装

$dep
depisatoolformanagingdependenciesforGoprojectsUsage:dep<command>Commands:initInitializeanewprojectwithmanifestandlockfiles
statusReportthestatusoftheproject'sdependencies
ensureEnsureadependencyissafelyvendoredintheproject
prunePrunethevendortreeofunusedpackagesExamples:
depinitsetupanewproject
depensureinstalltheproject'sdependencies
depensure-updateupdatethelockedversionsofalldependencies
depensure-addgithub.com/pkg/errorsaddadependencytotheprojectUse"dephelp[command]"formoreinformationaboutacommand.

有一个很重要的选项ensure中文含义是确保;保证;担保,作者想传达的意思是确保所有本地状态-代码树、清单、锁和供应商彼此同步

看到这个说明已经安装好了。

使用

老规矩,篇幅有限,我只介绍经常使用到的。 先进入在GOPATH的一个项目中。

cd$GOPATH/src/foordep

初始化(dep init)

$cdfoordep/
$depinit
$ll
total12
-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=1
inputs-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.lock

Ensurehasfasttechniquestodeterminethatsomeofthesestepsmaybe
unnecessary.Ifthatdeterminationismade,ensuremayskipsomesteps.Flags
maybepassedtobypassthesechecks;-vendor-onlywillallowanout-of-date
Gopkg.locktopopulatevendor/,and-no-vendorwillupdateGopkg.lock(ifneeded),butnevertouchvendor/.

Theeffectofpassingprojectspecargumentsvariesslightlydependingonthe
combinationofflagsthatarepassed.


Examples:

depensurePopulatevendorfromexistingGopkg.tomlandGopkg.lock
depensure-addgithub.com/pkg/fooIntroduceanameddependencyatitsnewestversion
depensure-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=1
inputs-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=1
inputs-digest="6fb93334da1b165aaab11f170d871a92b40033575e66e2cf4289e77e0d64551d"
solver-name="gps-cdcl"
solver-version=1

可以发现多了github.com/bitly/go-simplejson,但是Gopkg.toml并没有任何改变。注意:执行dep ensure -add时候报错

$depensure-addgithub.com/bitly/go-simplejson
Gopkg.tomlandGopkg.lockareoutofsync.Runaplaindepensuretoresyncthembeforeattemptingto-add

还可以指定依赖的版本:

$depensure-addgithub.com/bitly/go-simplejson@=0.4.3

是因为Gopkg.tomlGopkg.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.tomlversion规则:~=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时候出现

$depensure
errorwhileparsing/home/users/qiangmzsx/golang/src/foordep/Gopkg.toml:multipleconstraintsspecifiedforgithub.com/astaxie/beego,canonlyspecifyone

说明配置写错了,需要看看Gopkg.toml文件中是不是同时配置了versionbranchrevision

空配置

我们现在尝试着把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-v
Rootprojectis"foordep"
1transitivelyvalidinternalpackages
2externalpackagesimportedfrom2projects
(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/9pkgs
foundsolutionwith10packagesfrom2projects

Solverwalltimesbysegment:
b-list-versions:3.926086724s
b-list-pkgs:285.209471ms
b-gmal:266.828805msselect-atom:3.417834ms
satisfy:3.126864msselect-root:428.276μsnew-atom:234.106μs
other:45.014μs
b-source-exists:6.946μs
b-deduce-proj-root:3.472μs

TOTAL:4.485387512sUsing^0.5.0asconstraintfordirectdepgithub.com/bitly/go-simplejson
Lockinginv0.5.0(aabad6e)fordirectdepgithub.com/bitly/go-simplejsonUsing^1.8.3asconstraintfordirectdepgithub.com/astaxie/beego
Lockinginv1.8.3(cab8458)fordirectdepgithub.com/astaxie/beego

此时再查看Gopkg.tomlGopkg.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=1
inputs-digest="dc040fb12390d61768be6388ad2935bdd7f9cc93d4b1fdda421a284058277c80"
solver-name="gps-cdcl"
solver-version=1

glide一样,具有自举功能,不知道这个名词用得对不对。dep自动根据代码生成Gopkg.tomlGopkg.lock配置文件
PS:但是不建议使用,因为其拉取的依赖包都是最新的,可能出现不兼容,再者我国是一个被墙的地方。

dep cache

看到这里时候很多人都会有疑问?dep的依赖包每一次都是拉取新的还是优先使用本地cache呢?可以肯定的是dep也是有本地缓存的,大家可以打开$GOPATH/pkg/dep/看看,是不是存在呢!
下面我们做两个测试看看。

$GOPATH/src不存在依赖包

环境准备,将原来的cache和vendor清空,别遗漏了$GOPATH/src中的github.com/bitly/go-simplejson

$ll
total4-rwxr--r--1qiangmzsxqiangmzsx990Aug716:39main.go
$vimmain.go
packagemainimport("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查看初始化过程。

$ll
total4
-rwxr--r--1qiangmzsxqiangmzsx382Aug812:47main.go$depinit-gopath-v
SearchingGOPATHforprojects...
FollowingdependencieswerenotfoundinGOPATH.Depwillusethemostrecentversionsoftheseprojects.
github.com/bitly/go-simplejson
Rootprojectis"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/1pkgs
foundsolutionwith10packagesfrom2projects

Solverwalltimesbysegment:
b-list-pkgs:320.955115ms
b-gmal:274.950203ms
satisfy:8.179966msselect-atom:2.62224msnew-atom:392.168μs
b-list-versions:254.937μsselect-root:209.152μs
b-deduce-proj-root:40.45μs
other:37.01μs
b-source-exists:5.83μs

TOTAL:607.647071msUsing^1.8.3asconstraintfordirectdepgithub.com/astaxie/beego
Lockinginv1.8.3(cab8458)fordirectdepgithub.com/astaxie/beegoUsing^0.5.0asconstraintfordirectdepgithub.com/bitly/go-simplejson
Lockinginv0.5.0(aabad6e)fordirectdepgithub.com/bitly/go-simplejson

日志显示dep首先从$GOPATH查找github.com/bitly/go-simplejson,因为没有找到才从网络下载。

$GOPATH存在依赖包

环境准备,将原来的cache和vendor清空,注意$GOPATH/src中的github.com/bitly/go-simplejson存在。

$ll
total4
-rwxr--r--1qiangmzsxqiangmzsx382Aug812:47main.go$depinit-gopath-v
SearchingGOPATHforprojects...
Usingmasterasconstraintfordirectdepgithub.com/bitly/go-simplejson
Lockinginmaster(da1a892)fordirectdepgithub.com/bitly/go-simplejson
Rootprojectis"foordep"
1transitivelyvalidinternalpackages
2externalpackagesimportedfrom2projects
(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/1pkgs
foundsolutionwith10packagesfrom2projects

Solverwalltimesbysegment:
b-list-pkgs:312.646734ms
b-gmal:265.066047ms
satisfy:6.488056msselect-atom:3.287416msnew-atom:397.837μsselect-root:373.267μs
b-list-versions:108.466μs
other:47.43μs
b-source-exists:7.71μs
b-deduce-proj-root:6.568μs

TOTAL:588.429531msUsing^1.8.3asconstraintfordirectdepgithub.com/astaxie/beego
Lockinginv1.8.3(cab8458)fordirectdepgithub.com/astaxie/beego

可以看到github.com/bitly/go-simplejson是优先从$GOPATH获取的。 好处我个人认为有两个:

  • 节省时间;

  • 本地类库的稳定性和兼容性已经经过用户验证了。

dep v0.1时候还不需要手动加上-gopath选项,dep工具会自动判断,但是dep v0.3后如果没有加上-gopath那么默认就是从网络下载。

更新配置 (dep ensure -update)

现在修改foordep项目的Gopkg.toml内容为:

$vimGopkg.toml
[[constraint]]
name="github.com/astaxie/beego"
#约束为1.8.0
version="=1.8.0"[[constraint]]
name="github.com/bitly/go-simplejson"
version="0.5.0"$depensure-update
Gopkg.tomlandGopkg.lockareoutofsync.Runaplaindepensuretoresyncthembeforeattemptingto-update$depensure$depensure-update-v
Rootprojectis"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/1pkgs
foundsolutionwith9packagesfrom2projects

Solverwalltimesbysegment:
b-source-exists:4.00794324s
b-list-pkgs:2.545452669s
b-gmal:276.070372mssatisfy:5.179016ms
select-atom:4.337704ms
new-atom:1.359055ms
b-list-versions:467.799μs
b-matches:371.239μs
select-root:193.471μs
b-pair-rev:127.992μsother:25.962μs
b-pair-version:7.866μsTOTAL:6.841536385s$depstatus
PROJECTCONSTRAINTVERSIONREVISIONLATESTPKGSUSED
github.com/astaxie/beego1.8.0v1.8.0323a1c4323a1c48github.com/bitly/go-simplejson^0.5.0v0.5.0aabad6eaabad6e1

后记

看到了这里,那么对dep已经可以进行基本的使用了,不过目前而言,dep还不够稳定,谁也不知道后续会怎么样更改,尝鲜可以,个人还不建议使用在线上。 如果大家喜欢这篇博文请点赞或者留言,有不同见解的也请留言讨论。

猜你在找的Go相关文章