整理一下vendor相关的使用,以及golang包管理的一些基本知识。
之前好多golang的包管理项目使用的是godepth,之前也整理过一些相关的使用,但是总是用的不太好,每次使用的时候,都是把依赖从各个项目之间考过来拷过去,这样会造成一个问题,当本机上的项目躲起来的时候,必然会造成“依赖污染”。主要是版本之间的切换,因为不同项目对同一个依赖有不同的版本。
常用的一个方法就是每个项目有自己的一个private环境,在这个private环境中仅仅存放当前这个项目的依赖,比如python的vortualenv就是这样做的。
在之前的使用中,通常使用的工具是godepth,在build的时候也
发现好多golang项目都使用到 godep 作为包管理的工具,像比较大型的项目,比如kubernetes这种,都是使用的是godep来进行依赖管理操作的了,小的项目貌似可以直接采用go install同时完成编译以及下载依赖的工作,但是大的项目可能不是这么方便,Godep就比较有必要了,看了一下有点像maven的感觉,这里记录一下基本的操作。
由于网络的问题,goget的时候有一个包会找不到,网上有好多替代的解决方案,比如说 这个 ,注意一点,这个文章里面说的tools文件夹,指的是在GOPATH/src/github.com/golang 下面的文件夹,注意不要弄混了。
比如说建立了一个基本的项目,就拿beego的示例项目来说。这里又一点要注意,没有使用版本控制的时候,go save是不成功的,会报类似如下的错误:
godep: error while inspecting "/Users/Hessen/goworkspace/src/testBee/bapi": directory "/Users/Hessen/goworkspace/src" is not using a known version control system
具体的原因 这个文章 讲解的比较详细。总是先要使用版本控制工具将整个项目初始化一下。之后 godev save 就可以看到在当前的目录下生成了Godeps的文件夹,里面有_workspace文件夹,存储着依赖包的源码,还有Godeps.json文件,具体描述了依赖关系。这里比较好的地方就是不用像maven那样自己去编辑对应的依赖包的描述文件,完全是根据版本控制工具自动生成的。
restore 的操作和go save的操作是相反进行的,比如git 上一个使用godep的项目,pull下来之后,使用godep restore就可以把Godeps/Godeps.json中列出的依赖拷贝到本地的GOPATH下面。有一个问题要注意,如果之间已经有安装过相关的包,并且进行了一些修改,进行过一些pull,request的操作,可能会有一些git的相关错误。
godep go build -a xxxx 在go build的时候,直接使用godep前缀,就可以通过godepth中的相关依赖进行build。
http://tonybai.com/2014/10/30/a-hole-of-godep/
http://studygolang.com/articles/2147
主要特点还是官方支持吧,在1.5的版本中,使用了 GO15VENDOREXPERIMENT=1
的参数,在1.6版本的时候,就默认的支持在go build的时候,从vendor文件夹下寻找相关的依赖了。这里 是一个govendor的辅助工具,需要自己build,之后把环境变量添加好。
可以看下大致提供的命令:
govendor (v1.0.2): record dependencies and copy into vendor folder -govendor-licenses Show govendor's licenses. Sub-Commands init Create the "vendor" folder and the "vendor.json" file. list List and filter existing dependencies and packages. add Add packages from $GOPATH. update Update packages from $GOPATH. remove Remove packages from the vendor folder. status Lists any packages missing, out-of-date, or modified locally. fetch (beta) Add new or update existing packages from remote repository. sync (beta) Pull in packages from remote respository to match vendor.json file. migrate Move packages from a legacy tool to the vendor folder with metadata. get Like "go get" but copies dependencies into a "vendor" folder. license List discovered licenses for the given status or import paths. go tool commands that are wrapped: "+status" package selection may be used with them fmt, build, install, clean, test, vet, generate Status Types +local (l) packages in your project +external (e) referenced packages in GOPATH but not in current project +vendor (v) packages in the vendor folder +std (s) packages in the standard library +unused (u) packages in the vendor folder, but unused +missing (m) referenced packages but not found +program (p) package is a main package +outside +external +missing +all +all packages Status can be referenced by their initial letters.
应当满足了当前的需求,可以看到哪些包是在local的,哪些是vendor的,哪些是external的等等,还提供了从其他包管理工具迁移的操作。