Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包。类似 Java 的 Maven,PHP 的 Composer。
主要特性:
简单管理依赖
支持 versioning packages,包括 Semantic Versioning 2.0.0 支持
支持 aliasing packages (e.g. for working with github forks)
Remove the need for munging import statements
支持所有
go
工具支持 VCS 工具和 Go 支持:git、bzr、hg、svn
支持定制本地和全局插件 (see docs/plugins.md)
仓库缓存
结构:
- $GOPATH/src/myProject (Your project)
|
|-- glide.yaml
|
|-- glide.lock
|
|-- main.go (Your main go code can live here)
|
|-- mySubpackage (You can create your own subpackages, too)
| |
| |-- foo.go
|
|-- vendor
|-- github.com
|
|-- Masterminds
|
|-- ... etc.
安装
# 下载源码包(目前版本:0.12.3)
go get github.com/Masterminds/glide # 进入目录
cd github.com/Masterminds/glide # 编译
# 注意,如果是离线安装的话,需要执行 go install
make build
go build -o glide -ldflags "-X main.version=v0.11.0" glide.go
使用
检测项目的依赖包
Glide 能检测项目的依赖包 并且 创建一个名为 glide.yaml 的文件。能自动识别 Godep, GPM, Gom, and GB 等工具的配置文件。在 项目的 根目录 执行如下命令:
glide init
运行 glide init 命令的时候,会询问你是否需要以向导的方式提示及配置依赖包的版本,每步操作都需要你的确认。
更新 依赖包
执行如下命令,依据配置文件 glide.yaml 的内容,计算各个依赖包的精确版本号:
glide up
“up”是“update”的简写。这个命令会根据 glide.yaml 文件计算所需依赖包,并递归计算依赖包所需依赖包,并且确认各个依赖包的版本号。最后把这些信息写到一个名为 glide.lock 的文件中。
Glide 会把所有依赖包放到项目根目录的 vendor/ 目录下。如果某个依赖包有自己的 vendor/ 目录,默认情况下,Glide 不会删除它。go 工具链会使用它们的嵌套版本。如果想移除它们,使用 up 或 install 命令时,再加一个 --strip-vendor 或 -v 标签。
安装 依赖包
如果想下载所需依赖包,执行如下命令:
glide install
这个命令会做以下 2 件事:
(1) 如果 glide.lock 文件已经存在,Glide 会把 glide.lock 中已经计算好的确定版本号的依赖包批量下载到 vendor/ 目录下;
(2) 如果 glide.local 文件不存在,则会先执行 update 命令;
增加更多的 依赖包
使用 get 命令,Glide 能帮你添加更多的依赖包到 glide.yaml 文件中,如下所示:
glide get github.com/Masterminds/semver
glide get 命令功能 类似 go get,但是它会把依赖包下载到 vendor/ 目录,并且把相关信息配置到 glide.yaml 文件。
这个 get 命令 也可以带版本号,如下所示:
glide get github.com/Masterminds/semver#~1.2.0
“#”是依赖包 和 版本号的分隔符,版本号可以是 语义版本,范围版本,分支版本,标签 或 提交的版本ID。
如果没有指定 具体版本号 或 范围版本号, Glide 会使用 语义版本号,并且提示要求你确认所需要的版本号
注意:
glide 会把下载下来的包缓存到
~/.glide/cache
目录下 。
版本号的指定(version字段)
Glide 支持 语义版本,范围版本,分支版本,标签版本,版本ID 最为版本号。
基本范围
举个简单例子,范围版本 > 1.2.3,表示 Glide 会用 大于 1.2.3 以后的最新版本。目前支持如下操作符:
- =: equal (aliased to no operator)
- !=: not equal
- >: greater than
- <: less than
- >=: greater than or equal to
- <=: less than or equal to
它们还可以组合用,“,”表示 “逻辑与”,“||”表示“逻辑或”,如 ">= 1.2, < 3.0.0 || >= 4.2.3"
连字符范围
- 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
通配符比较
字符 “x”、“X”、"*" 可以当做通配符,它可以应用于所有的比较操作中。当应用于“=”操作符中,它表示补丁最低级别的比较,如下所示:
- 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.yaml 文件
文件 glide.yaml 包含了 当前包(项目)及依赖包 的相关信息,以下示例罗列了该文件的主要元素:
package: github.com/Masterminds/glide
homepage: https://masterminds.github.io/glide
license: MIT
owners:
- name: Matt Butcher
email: technosophos@gmail.com
homepage: http://technosophos.com
- name: Matt Farina
email: matt@mattfarina.com
homepage: https://www.mattfarina.com
ignore:
- appengine
excludeDirs:
- node_modules
import:
- package: gopkg.in/yaml.v2
- package: github.com/Masterminds/vcs
version: ^1.2.0
repo: git@github.com:Masterminds/vcs
vcs: git
- package: github.com/codegangsta/cli
version: f89effe81c1ece9c5b0fda359ebd9cf65f169a51
- package: github.com/Masterminds/semver
version: ^1.0.0
testImport:
- package: github.com/arschles/assert
有以下元素:
-
package
: *包导入路径,即 相对 GOPATH/src 的包的导入路径。 -
homepage
: 项目的主页,如 http://k8s.io 。 - license: 项目的使用权协议。
-
owners
: 项目的作者信息,如 姓名、联系方式(email)、个人主页 等。 -
ignore
: 需要忽略导入的包名列表。注意,不是文件夹名。 -
excludeDirs
: 需要忽略扫描依赖包的文件夹列表。 -
import
: 需要导入的依赖包,每个依赖包 包含以下元素:-
package
: 包路径信息。 -
version
: 版本号,如 语义版本、范围版本、分支版本、标签版本、提交号版本等,更多的信息查看文档:versioning documentation。 -
repo
: 包的仓库地址信息。如果包名不是包仓库路径信息 或者是 私有仓库,可以从线上的仓库 check out 文件到 包名中指定的(本地)路径,也可以使用 fork 指令。 -
vcs
: 使用到的版本控制系统,如 git、hg、bzr 或 svn。如果不能从上述的 package 中确定 版本控制系统类型的话,需要在这里指定。如 仓库路径带有 .git 后缀 或 GitHub 仓库路径 等都可以自动识别类型为 git。 -
subpackages
: 当前包所使用到的子包名列表。 -
os
: 能适用于哪些操作系统? 与 运行时(runtime) 当中的 操作系统变量(GOOS) 匹配比较,如果是匹配上,就获取该包。 -
arch
: 能使用于哪些结构?与 运行时(runtime) 当中的 runtime architecture 变量(GOARCH
)匹配比较,如果匹配上,就获取该包。
-
-
testImport
: 用于测试的包。
翻译自 官方教程:
http://glide.readthedocs.io/en/stable/versions/
延伸阅读: