转载

Golang Package Management

整理一下vendor相关的使用,以及golang包管理的一些基本知识。

之前好多golang的包管理项目使用的是godepth,之前也整理过一些相关的使用,但是总是用的不太好,每次使用的时候,都是把依赖从各个项目之间考过来拷过去,这样会造成一个问题,当本机上的项目躲起来的时候,必然会造成“依赖污染”。主要是版本之间的切换,因为不同项目对同一个依赖有不同的版本。

常用的一个方法就是每个项目有自己的一个private环境,在这个private环境中仅仅存放当前这个项目的依赖,比如python的vortualenv就是这样做的。

在之前的使用中,通常使用的工具是godepth,在build的时候也

以下是之前godepth的相关整理

发现好多golang项目都使用到 godep 作为包管理的工具,像比较大型的项目,比如kubernetes这种,都是使用的是godep来进行依赖管理操作的了,小的项目貌似可以直接采用go install同时完成编译以及下载依赖的工作,但是大的项目可能不是这么方便,Godep就比较有必要了,看了一下有点像maven的感觉,这里记录一下基本的操作。

由于网络的问题,goget的时候有一个包会找不到,网上有好多替代的解决方案,比如说 这个 ,注意一点,这个文章里面说的tools文件夹,指的是在GOPATH/src/github.com/golang 下面的文件夹,注意不要弄混了。

godep save

比如说建立了一个基本的项目,就拿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那样自己去编辑对应的依赖包的描述文件,完全是根据版本控制工具自动生成的。

godep restore

restore 的操作和go save的操作是相反进行的,比如git 上一个使用godep的项目,pull下来之后,使用godep restore就可以把Godeps/Godeps.json中列出的依赖拷贝到本地的GOPATH下面。有一个问题要注意,如果之间已经有安装过相关的包,并且进行了一些修改,进行过一些pull,request的操作,可能会有一些git的相关错误。

在build的时候 指定从godepth的目录进行

godep go build -a xxxx 在go build的时候,直接使用godep前缀,就可以通过godepth中的相关依赖进行build。

相关的介绍godep的博客

http://tonybai.com/2014/10/30/a-hole-of-godep/

http://studygolang.com/articles/2147

关于govendor

具体功能 使用背景

主要特点还是官方支持吧,在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的等等,还提供了从其他包管理工具迁移的操作。

原文  http://wangzhezhe.github.io/blog/2016/05/08/golang-package-management/
正文到此结束
Loading...