介绍
不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题。Java有牛逼轰轰的Maven和Gradle。 Golang亦有godep、govendor、glide、gvt、gopack等等,本文主要给大家介绍gilde。 glide是Golang的包管理工具,是为了解决Golang依赖问题的。
安装
Golang环境设置
Golang 1.5版本后才采用vendor目录特性。
//设置环境变量使用vendor目录GO15VENDOREXPERIMENT=1
安装glide
$ go get github.com/Masterminds/glide$ go install github.com/Masterminds/glide
验证
$ glideNAME: glide -Vendor Package Management for your Go projects. Each projectshould have a 'glide.yaml' file in the project directory. Files looksomething like this: package:github.com/Masterminds/glide imports: -package: github.com/Masterminds/cookoo version: 1.1.0 -package: github.com/kylelemons/go-gypsy subpackages: - yaml For moredetails on the 'glide.yaml' files see the documentation at https://glide.sh/docs/glide.yamlUSAGE: glide [globaloptions] command [command options] [arguments...]VERSION: 0.13.0-devCOMMANDS: create,init Initialize a new project,creating a glide.yaml file config-wizard, cw Wizard thatmakes optional suggestions to improve config in a glide.yaml file. get Install one or more packagesinto `vendor/` and add dependency to glide.yaml. remove,rm Remove a package from theglide.yaml file, and regenerate the lock file. import Import files from other dependencymanagement systems. name Print the name of this project. novendor,nv List all non-vendor paths in adirectory. rebuild Rebuild ('gobuild') the dependencies install,i Install a project'sdependencies update,up Update a project'sdependencies tree (Deprecated) Tree prints thedependencies of this project as a tree. list List prints all dependenciesthat the present code references. info Info prints information aboutthis project cache-clear, cc Clears theGlide cache. about Learn about Glide mirror Manage mirrors help,h Shows a list of commands orhelp for one commandGLOBAL OPTIONS: --yaml value,-y value Set a YAML configuration file.(default: "glide.yaml") --quiet,-q Quiet (no info or debugmessages) --debug Print debug verboseinformational messages --homevalue The location of Glidefiles (default: "/home/users/qiangmzsx/.glide") [$GLIDE_HOME] --tmpvalue The temp directory touse. Defaults to systems temp [$GLIDE_TMP] --no-color Turn offcolored output for log messages --help,-h show help --version,-v print the version
看到这样,那就恭喜你,已经安装成功了!!!
使用
篇幅有限,我只介绍经常使用到的。先进入在GOPATH的一个项目中。
cd $GOPATH/src/foor
初始化 (glide init)
$ glide init[INFO] Generating a YAML configuration file and guessing the dependencies[INFO] Attempting to import from other package managers (use --skip-import toskip)[INFO] Scanningcode to look for dependencies[INFO] -->Found reference to github.com/urfave/cli[INFO] Writingconfiguration file (glide.yaml)[INFO] Wouldyou like Glide to help you find ways to improve your glide.yaml configuration?[INFO] If youwant to revisit this step you can use the config-wizard command at any time.[INFO] Yes (Y)or No (N)?Y[INFO] Loadingmirrors from mirrors.yaml file[INFO] Lookingfor dependencies to make suggestions on[INFO] -->Scanning for dependencies not using version ranges[INFO] -->Scanning for dependencies using commit ids[INFO] Gathering information on each dependency[INFO] -->This may take a moment. Especially on a codebase with many dependencies[INFO] -->Gathering release information for dependencies[INFO] -->Looking for dependency imports where versions are commit ids[INFO] Here aresome suggestions...[INFO] Thepackage github.com/urfave/cli appears to have Semantic Version releases(http://semver.org).[INFO] Thelatest release is v1.19.1. You are currently not using a release. Would youlike[INFO] to usethis release? Yes (Y) or No (N)Y[INFO] Wouldyou like to remember the previous decision and apply it to future[INFO] dependencies? Yes (Y) or No (N)Y[INFO] Updatinggithub.com/urfave/cli to use the release v1.19.1 instead of no release[INFO] Thepackage github.com/urfave/cli appears to use semantic versions(http://semver.org).[INFO] Wouldyou like to track the latest minor or patch releases (major.minor.patch)?[INFO] Trackingminor version releases would use '>= 1.19.1, < 2.0.0' ('^1.19.1').Tracking patch version[INFO] releaseswould use '>= 1.19.1, < 1.20.0' ('~1.19.1'). For more information onGlide versions[INFO] andranges see https://glide.sh/docs/versions[INFO] Minor(M), Patch (P), or Skip Ranges (S)?P[INFO] Wouldyou like to remember the previous decision and apply it to future[INFO] dependencies? Yes (Y) or No (N)Y[INFO] Updatinggithub.com/urfave/cli to use the range ~1.19.1 instead of commit id v1.19.1[INFO] Configuration changes have been made. Would you like to write these[INFO] changesto your configuration file? Yes (Y) or No (N)Y[INFO] Writingupdates to configuration file (glide.yaml)[INFO] You cannow edit the glide.yaml file.:[INFO] -->For more information on versions and ranges see https://glide.sh/docs/versions/[INFO] -->For details on additional metadata see https://glide.sh/docs/glide.yaml/$ llglide.yaml$ cat glide.yaml package: foorimport: []
在初始化过程中, glide 会询问一些问题。 glide.yaml记载了依赖包的列表及其更新规则,每次执行 glide up 时,都会按照指定的规则(如只下载补丁(patch)不下载升级(minor))下载新版。
一个完整的gilde.yaml
package: foorhomepage:https://github.com/qiangmzsxlicense: MITowners:-name: qiangmzsx email: qiangmzsx@hotmail.com homepage:https://github.com/qiangmzsx# 去除包ignore:- appengine- golang.org/x/net# 排除目录excludeDirs:- node_modules# 导入包import:-package:github.com/astaxie/beego version: 1.8.0-package:github.com/coocood/freecache-package:github.com/garyburd/redigo/redis-package:github.com/go-sql-driver/mysql-package:github.com/bitly/go-simplejson-package:git.oschina.net/qiangmzsx/beegofreecachetestImport:-package: github.com/smartystreets/goconvey subpackages: - convey
很多人看着yaml很不习惯,没事,我转一下json给大家看看。
{ "excludeDirs":[ "node_modules" ], "owners":[ { "homepage":"https://github.com/qiangmzsx", "name":"qiangmzsx", "email":"qiangmzsx@hotmail.com" } ], "license":"MIT", "package":"foor", "ignore":[ "appengine", "golang.org/x/net" ], "import":[ { "version":"1.8.0", "package":"github.com/astaxie/beego" }, { "package":"github.com/coocood/freecache" }, { "package":"github.com/garyburd/redigo/redis" }, { "package":"github.com/go-sql-driver/mysql" }, { "package":"github.com/bitly/go-simplejson" }, { "package":"git.oschina.net/qiangmzsx/beegofreecache" } ], "testImport":[ { "subpackages":[ "convey" ], "package":"github.com/smartystreets/goconvey" } ], "homepage":"https://github.com/qiangmzsx"}
版本号指定规则
=: equal (aliasedto no operator)!=: not equal>: greater than<: less than>=: greater than or equal to<=: less than or equal to1.2 - 1.4.5 which is equivalent to >= 1.2, <=1.4.52.3.4 - 4.5 which is equivalent to >= 2.3.4, <=4.51.2.x is equivalent to >= 1.2.0, < 1.3.0>= 1.2.x is equivalent to >= 1.2.0<= 2.x is equivalent to < 3* is equivalent to >= 0.0.0~1.2.3 is equivalent to >= 1.2.3, < 1.3.0~1 is equivalent to >= 1, < 2~2.3 is equivalent to >= 2.3, < 2.4~1.2.x is equivalent to >= 1.2.0, < 1.3.0~1.x is equivalent to >= 1, < 2^1.2.3 is equivalent to >= 1.2.3, < 2.0.0^1.2.x is equivalent to >= 1.2.0, < 2.0.0^2.3 is equivalent to >= 2.3, < 3^2.x is equivalent to >= 2.0.0, < 3
’‘指定版本报错,需要用’’指定的可以不填写
安装依赖 (glide install)
glide.yaml我们已经准备好了,现在就改安装一下试试。
$ glide install[ERROR] Failed to parse/home/users/xxxx/golang/src/foor/glide.yaml: yaml: invalid leading UTF-8 octet报错了!别担心看看你的yaml文件是否为utf-8编码,不是就转换一下就好啦!$ glide install[INFO] Lockfile (glide.lock) does not exist. Performing update.[INFO] Downloading dependencies. Please wait...[INFO] -->Fetching updates for github.com/go-sql-driver/mysql[INFO] -->Fetching updates for github.com/astaxie/beego[INFO] -->Fetching updates for github.com/coocood/freecache[INFO] -->Fetching updates for git.oschina.net/qiangmzsx/beegofreecache[INFO] -->Fetching updates for github.com/bitly/go-simplejson[INFO] -->Fetching updates for github.com/garyburd/redigo[INFO] -->Fetching updates for github.com/smartystreets/goconvey[INFO] -->Detected semantic version. Setting version for github.com/astaxie/beego tov1.8.0[INFO] Resolving imports[INFO] Downloading dependencies. Please wait...[INFO] Settingreferences for remaining imports[INFO] Exporting resolved dependencies...[INFO] -->Exporting github.com/astaxie/beego[INFO] -->Exporting github.com/coocood/freecache[INFO] -->Exporting github.com/bitly/go-simplejson[INFO] --> Exportinggithub.com/go-sql-driver/mysql[INFO] -->Exporting github.com/garyburd/redigo[INFO] -->Exporting github.com/smartystreets/goconvey[INFO] -->Exporting git.oschina.net/qiangmzsx/beegofreecache[INFO] Replacing existing vendor dependencies[INFO] Projectrelies on 6 dependencies.$ lltotal 12glide.lockglide.yamlvendor$ ll vendor/git.oschina.netgithub.com
看到glide.look了吗,这个文件记载了依赖包确定的revision, 下次再执行 glide install 时,会直接读这个文件下载确定的版本。
升级版本 (glide up)
glide up 会按照语义化版本规则更新依赖包代码,开发过程中如果需要使用新版代码,可以执行这个命令:修改一下glide.yaml中的一个Package.
- package:github.com/astaxie/beego version: 1.8.3
执行glide up。
$ glide up[INFO] Downloading dependencies. Please wait...[INFO] -->Fetching updates for git.oschina.net/qiangmzsx/beegofreecache[INFO] -->Fetching updates for github.com/garyburd/redigo[INFO] -->Fetching updates for github.com/go-sql-driver/mysql[INFO] -->Fetching updates for github.com/astaxie/beego[INFO] -->Fetching updates for github.com/bitly/go-simplejson[INFO] -->Fetching updates for github.com/coocood/freecache[INFO] -->Fetching updates for github.com/smartystreets/goconvey[INFO] -->Detected semantic version. Setting version for github.com/astaxie/beego tov1.8.3[INFO] Resolving imports[INFO] Downloading dependencies. Please wait...[INFO] Settingreferences for remaining imports[INFO] Exporting resolved dependencies...[INFO] -->Exporting github.com/astaxie/beego[INFO] -->Exporting github.com/bitly/go-simplejson[INFO] -->Exporting github.com/garyburd/redigo[INFO] -->Exporting github.com/go-sql-driver/mysql[INFO] -->Exporting github.com/coocood/freecache[INFO] -->Exporting github.com/smartystreets/goconvey[INFO] -->Exporting git.oschina.net/qiangmzsx/beegofreecache[INFO] Replacing existing vendor dependencies[INFO] Projectrelies on 6 dependencies.
添加并下载依赖 (glide get)
除了自动从代码中解析 import 外,glide 还可以通过 glide get 直接下载代码中没有的依赖,与 go get 的用法基本一致:
$ glide getgithub.com/orcaman/concurrent-map[INFO] Preparing to install 1 package.[INFO] Attempting to get package github.com/orcaman/concurrent-map[INFO] -->Gathering release information for github.com/orcaman/concurrent-map[INFO] -->Adding github.com/orcaman/concurrent-map to your configuration[INFO] Downloading dependencies. Please wait...[INFO] -->Fetching updates for github.com/garyburd/redigo[INFO] -->Fetching updates for github.com/astaxie/beego[INFO] -->Fetching updates for github.com/go-sql-driver/mysql[INFO] -->Fetching updates for git.oschina.net/qiangmzsx/beegofreecache[INFO] -->Fetching updates for github.com/bitly/go-simplejson[INFO] -->Fetching github.com/orcaman/concurrent-map[INFO] -->Fetching updates for github.com/coocood/freecache[INFO] -->Fetching updates for github.com/smartystreets/goconvey[INFO] Resolving imports[INFO] Downloading dependencies. Please wait...[INFO] -->Detected semantic version. Setting version for github.com/astaxie/beego tov1.8.3[INFO] Exporting resolved dependencies...[INFO] -->Exporting github.com/smartystreets/goconvey[INFO] -->Exporting github.com/garyburd/redigo[INFO] -->Exporting github.com/go-sql-driver/mysql[INFO] -->Exporting github.com/orcaman/concurrent-map[INFO] -->Exporting github.com/astaxie/beego[INFO] -->Exporting github.com/bitly/go-simplejson[INFO] -->Exporting github.com/coocood/freecache[INFO] -->Exporting git.oschina.net/qiangmzsx/beegofreecache[INFO] Replacing existing vendor dependencies
使用镜像 (glide mirror)
[WARN] Unable to checkout golang.org/x/crypto[ERROR] Update failed for golang.org/x/crypto: Cannotdetect VCS[ERROR] Failed to do initial checkout of config:Cannot detect VCS
这几行信息估计很多人都是遇到过的。在我天朝或者在公司内部都可能不能访问一些站点,导致很Golang的依赖包不能通过go get下载。此时也就是glide大发神威的时候到了,可以通过配置将墙了的版本库 URL 映射到没被墙的 URL,甚至也可以映射到本地版本库。将golang.org映射到github: 修改glide.yaml加入
- package:golang.org/x/crypto
如果你的网络可以访问就不需要使用glide镜像功能,可以跳过。
$ glide mirrorset golang.org/x/crypto github.com/golang/crypto[INFO] golang.org/x/crypto being set to github.com/golang/crypto[INFO] mirrors.yaml written with changes$ glide up[INFO] Loadingmirrors from mirrors.yaml file[INFO] Downloading dependencies. Please wait...[INFO] -->Fetching updates for github.com/orcaman/concurrent-map[INFO] -->Fetching golang.org/x/crypto[INFO] -->Fetching updates for github.com/astaxie/beego[INFO] -->Fetching updates for github.com/go-sql-driver/mysql[INFO] -->Fetching updates for github.com/garyburd/redigo[INFO] -->Fetching updates for github.com/coocood/freecache[INFO] -->Fetching updates for github.com/bitly/go-simplejson[INFO] -->Fetching updates for git.oschina.net/qiangmzsx/beegofreecache[INFO] -->Fetching updates for github.com/smartystreets/goconvey[INFO] -->Detected semantic version. Setting version for github.com/astaxie/beego tov1.8.3[INFO] Resolving imports[INFO] Downloading dependencies. Please wait...[INFO] Settingreferences for remaining imports[INFO] Exporting resolved dependencies...[INFO] -->Exporting github.com/astaxie/beego[INFO] -->Exporting github.com/coocood/freecache[INFO] -->Exporting github.com/smartystreets/goconvey[INFO] -->Exporting github.com/garyburd/redigo[INFO] -->Exporting github.com/go-sql-driver/mysql[INFO] -->Exporting github.com/bitly/go-simplejson[INFO] -->Exporting github.com/orcaman/concurrent-map[INFO] -->Exporting golang.org/x/crypto[INFO] -->Exporting git.oschina.net/qiangmzsx/beegofreecache[INFO] Replacing existing vendor dependencies[INFO] Projectrelies on 8 dependencies.$ ll vendor/git.oschina.netgithub.comgolang.org
终于看到golang.org啦!!!细心的你一定已经发现了
[INFO] mirrors.yaml written with changes
说明执行glide mirror时候镜像配置写入到的是$HOME/.glide/mirrors.yaml中,打开看看。
repos:-original: golang.org/x/crypto repo: github.com/golang/crypto
还可以映射到本地目录。推荐大家可以去https://www.golangtc.com/download/package下载很多Golang类库。现在我去下载了:https://www.golangtc.com/static/download/packages/golang.org.x.text.tar.gz,解压到本地目录/home/users/qiangmzsx/var/golang/golang.org/x/text。
$ glide mirrorset golang.org/x/text /home/users/qiangmzsx/var/golang/golang.org/x/text[INFO] golang.org/x/textbeing set to /home/users/qiangmzsx/var/golang/golang.org/x/text[INFO] mirrors.yaml written with changes$ glide up[INFO] Loadingmirrors from mirrors.yaml file[INFO] Downloading dependencies. Please wait...[INFO] -->Fetching golang.org/x/text[INFO] -->Fetching updates for github.com/garyburd/redigo[INFO] -->Fetching updates for git.oschina.net/qiangmzsx/beegofreecache[INFO] -->Fetching updates for github.com/astaxie/beego[INFO] -->Fetching updates for github.com/bitly/go-simplejson[INFO] -->Fetching updates for github.com/go-sql-driver/mysql[INFO] -->Fetching updates for github.com/coocood/freecache[INFO] -->Fetching updates for github.com/orcaman/concurrent-map[INFO] -->Fetching updates for golang.org/x/crypto[INFO] -->Fetching updates for github.com/smartystreets/goconvey[INFO] -->Detected semantic version. Setting version for github.com/astaxie/beego tov1.8.3[INFO] Resolving imports[INFO] Downloading dependencies. Please wait...[INFO] Settingreferences for remaining imports[INFO] Exporting resolved dependencies...[INFO] -->Exporting github.com/astaxie/beego[INFO] -->Exporting github.com/go-sql-driver/mysql[INFO] -->Exporting github.com/bitly/go-simplejson[INFO] -->Exporting github.com/coocood/freecache[INFO] -->Exporting github.com/smartystreets/goconvey[INFO] -->Exporting github.com/garyburd/redigo[INFO] -->Exporting github.com/orcaman/concurrent-map[INFO] -->Exporting golang.org/x/text[INFO] -->Exporting golang.org/x/crypto[INFO] -->Exporting git.oschina.net/qiangmzsx/beegofreecache[INFO] Replacing existing vendor dependencies[INFO] Projectrelies on 9 dependencies.
全局选项
运行glide,在最后就可以看到
GLOBAL OPTIONS: --yaml value,-y value Set a YAML configuration file.(default: "glide.yaml") --quiet,-q Quiet (no info or debugmessages) --debug Print debug verboseinformational messages --homevalue The location of Glidefiles (default: "/home/users/qiangmzsx/.glide") [$GLIDE_HOME] --tmpvalue The temp directory touse. Defaults to systems temp [$GLIDE_TMP] --no-color Turn offcolored output for log messages --help,-h show help --version,-v print the version
如果大家想把glide的yaml文件换别的默认名称可以执行
$ glide -y qiangmzsx.yaml
在官网中会看到一个GLIDE_HOME变量,该变量就是/home/users/qiangmzsx/.glide。这个目录之前有提到过,除了包含有mirrors.yaml还有一个很重要的目录cache本地 cache,每次更新代码时, glide 都会在本地保存 cache,以备下次 glide install 使用。
GLIDE_HOME可以通过如下命令修改。
$ glide --home /home/glide
总结
除了上述说到的功能,glide还有很多好的功能,后续有机会在写出来吧。
总结一下,glide是一款功能丰富,完全满足需求的依赖管理工具,强烈大家使用。