Golang依赖管理工具:glide从入门到精通使用
介绍不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题。Java有牛逼轰轰的Maven和Gradle。 Golang亦有godep、govendor、glide、gvt、gopack等等,本文主要给大家介绍gilde。 glide是Golang的包管理工具,是为了解决Golang依赖问题的。 为什么需要glide? 原因很简单,Go 语言原生包管理的缺陷。罗列一下golang的 get 子命令管理依赖有很多大缺陷:
安装Golang环境设置采用vendor目录特性,Go 1.5 做为试验特性加入(需要指定 GO15VENDOREXPERIMENT=1 环境变量),并在 Go 1.6 正式引入的一个概念。多数 go 依赖解决方案都基于它的。GO15VENDOREXPERIMENT 是 Go 1.5 版本新增的一个环境变量,如果将值改为 1 则表示启用。它可以将项目根目录名为 vendor 的目录添加到 Go 的库搜寻路径中,实现一个局部依赖的效果。 //设置环境变量 使用vendor目录 GO15VENDOREXPERIMENT=1 为什么要选择glide? Glide 是众多实现 GO15VENDOREXPERIMENT 特性的包管理工具之一,但它是本文最为推荐的,具体为什么推荐它,原因很简单,因为它目前最受关注。 几大主要功能:
在这里给大家介绍 安装glide$ go get github.com/Masterminds/glide $ go install github.com/Masterminds/glide 验证$ glide NAME: glide - Vendor Package Management for your Go projects. Each project should have a 'glide.yaml' file in the project directory. Files look something 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 more details on the 'glide.yaml' files see the documentation at https://glide.sh/docs/glide.yaml USAGE: glide [global options] command [command options] [arguments...] VERSION: 0.13.0-dev COMMANDS: create,init Initialize a new project,creating a glide.yaml file config-wizard,cw Wizard that makes optional suggestions to improve config in a glide.yaml file. get Install one or more packages into `vendor/` and add dependency to glide.yaml. remove,rm Remove a package from the glide.yaml file,and regenerate the lock file. import Import files from other dependency management systems. name Print the name of this project. novendor,nv List all non-vendor paths in a directory. rebuild Rebuild ('go build') the dependencies install,i Install a project's dependencies update,up Update a project's dependencies tree (Deprecated) Tree prints the dependencies of this project as a tree. list List prints all dependencies that the present code references. info Info prints information about this project cache-clear,cc Clears the Glide cache. about Learn about Glide mirror Manage mirrors help,h Shows a list of commands or help for one command GLOBAL OPTIONS: --yaml value,-y value Set a YAML configuration file. (default: "glide.yaml") --quiet,-q Quiet (no info or debug messages) --debug Print debug verbose informational messages --home value The location of Glide files (default: "/home/users/qiangmzsx/.glide") [$GLIDE_HOME] --tmp value The temp directory to use. Defaults to systems temp [$GLIDE_TMP] --no-color Turn off colored 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 to skip) [INFO] Scanning code to look for dependencies [INFO] --> Found reference to github.com/urfave/cli [INFO] Writing configuration file (glide.yaml) [INFO] Would you like Glide to help you find ways to improve your glide.yaml configuration? [INFO] If you want to revisit this step you can use the config-wizard command at any time. [INFO] Yes (Y) or No (N)? Y [INFO] Loading mirrors from mirrors.yaml file [INFO] Looking for 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 are some suggestions... [INFO] The package github.com/urfave/cli appears to have Semantic Version releases (http://semver.org). [INFO] The latest release is v1.19.1. You are currently not using a release. Would you like [INFO] to use this release? Yes (Y) or No (N) Y [INFO] Would you like to remember the previous decision and apply it to future [INFO] dependencies? Yes (Y) or No (N) Y [INFO] Updating github.com/urfave/cli to use the release v1.19.1 instead of no release [INFO] The package github.com/urfave/cli appears to use semantic versions (http://semver.org). [INFO] Would you like to track the latest minor or patch releases (major.minor.patch)? [INFO] Tracking minor version releases would use '>= 1.19.1,< 2.0.0' ('^1.19.1'). Tracking patch version [INFO] releases would use '>= 1.19.1,< 1.20.0' ('~1.19.1'). For more information on Glide versions [INFO] and ranges see https://glide.sh/docs/versions [INFO] Minor (M),Patch (P),or Skip Ranges (S)? P [INFO] Would you like to remember the previous decision and apply it to future [INFO] dependencies? Yes (Y) or No (N) Y [INFO] Updating github.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] changes to your configuration file? Yes (Y) or No (N) Y [INFO] Writing updates to configuration file (glide.yaml) [INFO] You can now 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/ $ ll glide.yaml $ cat glide.yaml package: foor import: [] 在初始化过程中, glide 会询问一些问题。 glide.yaml记载了依赖包的列表及其更新规则,每次执行 glide up 时,都会按照指定的规则(如只下载补丁(patch)不下载升级(minor))下载新版。 一个完整的gilde.yamlpackage: foor homepage: https://github.com/qiangmzsx license: MIT owners: - 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/beegofreecache testImport: - 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 (aliased to no operator) !=: not equal >: greater than <: less than >=: greater than or equal to <=: less than or equal to 1.2 - 1.4.5 which is equivalent to >= 1.2,<= 1.4.5 2.3.4 - 4.5 which is equivalent to >= 2.3.4,<= 4.5 1.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] Lock file (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 to v1.8.0 [INFO] Resolving imports [INFO] Downloading dependencies. Please wait... [INFO] Setting references 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] --> Exporting github.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] Project relies on 6 dependencies. $ ll total 12 glide.lock glide.yaml vendor $ ll vendor/ git.oschina.net github.com 看到glide.lock了吗,这个文件记载了依赖包确定的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 to v1.8.3 [INFO] Resolving imports [INFO] Downloading dependencies. Please wait... [INFO] Setting references 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] Project relies on 6 dependencies. 添加并下载依赖 (glide get)除了自动从代码中解析 import 外,glide 还可以通过 glide get 直接下载代码中没有的依赖,与 go get 的用法基本一致: $ glide get github.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 to v1.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: Cannot detect 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 mirror set 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] Loading mirrors 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 to v1.8.3 [INFO] Resolving imports [INFO] Downloading dependencies. Please wait... [INFO] Setting references 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] Project relies on 8 dependencies. $ ll vendor/ git.oschina.net github.com golang.org 终于看到golang.org啦!!! 细心的你一定已经发现了 [INFO] mirrors.yaml written with changes 说明执行glide mirror时候镜像配置写入到的是 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,解压到本地目录 $ glide mirror set golang.org/x/text /home/users/qiangmzsx/var/golang/golang.org/x/text [INFO] golang.org/x/text being set to /home/users/qiangmzsx/var/golang/golang.org/x/text [INFO] mirrors.yaml written with changes $ glide up [INFO] Loading mirrors 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 to v1.8.3 [INFO] Resolving imports [INFO] Downloading dependencies. Please wait... [INFO] Setting references 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] Project relies on 9 dependencies. 全局选项运行glide,在最后就可以看到 GLOBAL OPTIONS: --yaml value,-v print the version 如果大家想把glide的yaml文件换别的默认名称可以执行 $ glide -y qiangmzsx.yaml 在官网中会看到一个GLIDE_HOME变量,该变量就是
$ glide --home /home/glide 总结除了上述说到的功能,glide还有很多好的功能,后续有机会在写出来吧。 总结一下,glide是一款功能丰富,完全满足需求的依赖管理工具,强烈大家使用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |