logo头像

Aoho's Blog

Go的包管理工具(二):glide

在上一篇文章中介绍了 Go 的环境配置和包管理的几种方式。Go 的包管理是一直是为人诟病之处,从 Go 1.5 引入的 vendor 机制、准官方工具dep,到 Go 1.5 的 go modules,目前为止还没一个简便的解决方案。本文将会介绍 glide

glide 是在 vendor 之后出来的。glide 的依赖包信息在 glide.yaml 和 glide.lock 中,前者记录了所有依赖的包,后者记录了依赖包的版本信息

工作原理

Glide 扫描应用程序或库的源代码以确定所需的依赖项。要确定版本和位置(例如forks的别名),Glide会使用规则读取 glide.yaml 文件。有了这些信息,Glide将检索所需的依赖项。

遇到依赖包时,会扫描其导入以确定依赖关系的依赖关系(传递依赖关系)。如果依赖项目包含 glide.yaml 文件,则该信息用于帮助确定从要使用的位置或版本获取时的依赖关系规则。还会导入 Godep,GB,GOM 和GPM 的配置。依赖项将导出到 verdor。生成的 glide.lock 文件,包含所有依赖项,包括传递依赖项。

安装 glide

可以通过脚本安装:

1
curl https://glide.sh/get | sh

执行之后,将会安装最新的 release 版本。在 Mac 上,还可以通过 brew install glide 安装。

1
2
$ glide -v
glide version v0.13.2

0.13.2 是当前最新的版本。

初始化 glide

首先需要进入 GOPATH 中的项目,

1
cd $GOPATH/src/go-web-practice

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ glide create
[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/Masterminds/semver
[INFO] --> Found reference to github.com/Masterminds/vcs
[INFO] --> Found reference to github.com/codegangsta/cli
[INFO] --> Found reference to gopkg.in/yaml.v2
[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)?
n
[INFO] You can now edit the glide.yaml file. Consider:
[INFO] --> Using versions and ranges. See https://glide.sh/docs/versions/
[INFO] --> Adding additional metadata. See https://glide.sh/docs/glide.yaml/
[INFO] --> Running the config-wizard command to improve the versions in your configuration

执行初始化,glide.yaml 记载了依赖包的列表及其更新规则,每次执行 glide up 时,都会按照指定的规则下载新版。如下笔者示例创建的 glide.yaml

1
2
3
4
5
6
7
8
9
10
11
package: gowebpractice
import:
- package: github.com/coocood/freecache
- package: github.com/Masterminds/cookoo
version: ^1.2.0
repo: git@github.com:Masterminds/cookoo.git
- package: golang.org/x/crypto
testImport:
- package: github.com/smartystreets/goconvey
subpackages:
- convey

glide.yaml 中做了两件事:

  • 命名了当前的报名
  • 声明了外部的依赖

第一个库的导入,说明了最小的包导入,提供了完全限定的导入路径。当 Glide 读取第二个库的定义时,它将从 repo 中的源获取,检出 1.2.0 和 2.0.0 之间的最新版本,并将其放在 vendor/ 中的github.com/Masterminds/cookoo 文件夹。

项目的结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- $GOPATH/src/myProject
|
|-- glide.yaml
|
|-- glide.lock
|
|-- main.go
|
|-- mySubpackage
| |
| |-- foo.go
|
|-- vendor
|-- github.com
|
|-- Masterminds
|
|-- ... etc.

安装依赖

1
glide install

如上的命令将安装 glide.lock 文件中列出的版本,跳过扫描,除非 glide.lock 文件找不到,它将会执行更新。

直接下载依赖

1
glide get

除了自动从代码中解析 import 外,glide 还可以通过 glide get 直接下载代码中没有的依赖,与 go get 的用法基本一致。

升级依赖

1
glide up

glide 会按照语义化版本规则更新依赖包代码,开发过程中如果需要使用新版代码,可以执行这个命令。

使用镜像

当下载 golang.org/x/crypto 时,由于地址被墙,导致 Update failed for golang.org/x/crypto: Cannot detect VCS。这时候可以使用 glide 镜像的功能,配置可以下载的url,或者映射到本地仓库。将 golang.org 映射到 github :

1
2
3
4
$ 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

再次 install 即可成功。从上面的输出还可以看出,执行 glide mirror 时候镜像配置写入到的是$HOME/.glide/mirrors.yaml 中,打开看看。下面是笔者的 glide 镜像配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
repos:
- original: https://golang.org/x/crypto
repo: https://github.com/golang/crypto
vcs: git
- original: https://golang.org/x/crypto/acme/autocert
repo: https://github.com/golang/crypto
vcs: git
- original: https://golang.org/x/image
repo: https://github.com/golang/image
vcs: git
- original: https://golang.org/x/mobile
repo: https://github.com/golang/mobile
vcs: git
- original: https://golang.org/x/net
repo: https://github.com/golang/net
vcs: git
- original: https://golang.org/x/net/context
repo: https://github.com/golang/net
base: golang.org/x/net
vcs: git
- original: https://golang.org/x/net/html
repo: https://github.com/golang/net
base: golang.org/x/net
vcs: git
- original: https://golang.org/x/sys
repo: https://github.com/golang/sys
vcs: git
- original: https://golang.org/x/sys/unix
repo: https://github.com/golang/sys
base: golang.org/x/sys
vcs: git
- original: https://golang.org/x/text
repo: https://github.com/golang/text
vcs: git
- original: https://golang.org/x/tools
repo: https://github.com/golang/tools
vcs: git

可以去 https://www.golangtc.com/download/package 下载更多的 Golang 类库。

小结

使用 glide 的好处是,每个项目都采用各自独立的包,而且可以很好的控制包的版本,这在团队开发中尤其重要。glide 与之前提到的 godep、dep、govendor 相比,不将依赖包放置到 GOPATH 去的,因此新拉一个目录编比较花时间,不过也可以手动拷 package 到 vendor 里面,使用时候可以考虑这个功能的优劣。

推荐阅读

Go的包管理工具

订阅最新文章,欢迎关注我的公众号

微信公众号

参考

  1. glide docs
  2. Golang依赖管理工具:glide从入门到精通使用
微信打赏

赞赏是不耍流氓的鼓励

评论系统未开启,无法评论!