安装
1 | go get github.com/tools/godep |
出错1
package golang.org/x/tools/go/vcs: unrecognized import path "golang.org/x/tools/go/vcs"
解决:虽然出错但是某些文件已经下载下来,如src/github.com/tools/godep/vendor/golang.org/x/tools/go/vcs
文件夹,创建src/golang.org/x/tools/go/vcs
文件夹,并将src/github.com/tools/godep/vendor/golang.org/x/tools/go/vcs
文件夹,并将其内容复制到src/golang.org/x/tools/go/vcs
文件夹,重新$ go get github.com/tools/godep
。
保存依赖:旧版本
进入beego项目,执行godep save -r ./...
。
因为依赖的项目和项目本身都应该是个git repository,所以应该根据提示将依赖项目处理为git repository。1
2
3git init
git add *
git commit -m "init"
godep save -r ./...
命令完成以下工作:
首先,godep会扫描当前目录下所属包中的import语句导入的所有外部依赖库(系统库忽略),取得外部依赖库的路径和当前对应的版本(即commit id)保存到Godeps/Godeps.json里,格式是JSON。
其次,godep会将每个依赖库都从$GOPATH目录拷贝到Godeps/_workspace下,注意拷贝的内容不包含代码管理信息比如.git目录,拷贝后的目录结构与$GOPATH完全相同。
并且beego项目内对外部依赖库的import路径都会被修改。
成功执行的话会在项目目录下生成Godeps目录。将beego项目重新提交。
1 | 每次新增一个原文件时,你都应该再次执行 godep save -r ./... 以确保你应用的相关依赖都被重写与记录。 |
保存依赖:新版本
进入beego项目,执行godep save ./...
。
在GO15VENDOREXPERIMENT=1时,将使用vendor目录(而不是Godeps目录)存放copy的第三方包,并在godep go build时不再rewrite GOPATH就可以实现利用vendor下第三方包的构建。
升级godep到最新版本
如果要用到go 1.5 vendor,那么godep要升级(go get -u github.com/tools/godep;go build github.com/tools/godep
)到当前的最新版本“commit d8799f112f6c8dfe1e56142831bc3bb5c8796a0e”。最新版本兼容老版本的功能,同时提供对go 1.5 vendor支持,两者之间转换的开关就是环境变量:GO15VENDOREXPERIMENT
。
当GO15VENDOREXPERIMENT没有被set时,godep沿用以前的方式;当GO15VENDOREXPERIMENT = 1时,godep将用vendor替代Godeps目录以存放第三方包,同时go save将无法使用-r命令行选项(-r选项用于重写源码中的import path):
如果使用godep save -r
将出现godep: flag -r is incompatible with the vendoring experiment
注意:go get github.com/tools/godep之后最好使用一个新项目验证保存依赖情况,验证godep是否是最新版本。
其他问题
加入A机器上的项目使用godep保存依赖,并移植到B机器,之后B机器的项目引用了新的第三方库,如果继续使用godep save ./…
保存依赖的话,可能会出现一些错误。这种情况下,首先执行godep restore
,再执行godep save ./…
。
迁移:待检验正确性
由于godep前后的两种工作模式并不兼容,因此大量使用godep的repo,如果想使用Go 1.5 vendor,那么在升级到Go 1.5之后需要做一些迁移工作。godep没有提供自动的迁移工具,目前只能手动迁移,godep github主页上给出了手动迁移的命令步骤:1
2unset GO15VENDOREXPERIMENT
godep restore
如果之前使用了godep save -r,那么下面这行命令将自动undo rewritten import。1
godep save ./…
1 | rm -rf Godeps |
Godeps/_workspace/src的文件将”moved”到vendor/。