在上一篇文章中介紹了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
可以通過腳本安裝:
curl https://glide.sh/get | sh
執行之後,將會安裝最新的 release 版本。在 Mac 上,還可以通過 brew install glide 安裝。
$ glide -v
glide version v0.13.2
初始化 glide
首先需要進入 GOPATH 中的項目,
cd $GOPATH/src/go-web-practice
初始化
$ 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
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 文件夾。
項目的結構
- $GOPATH/src/myProject
|
|-- glide.yaml
|
|-- glide.lock
|
|-- main.go
|
|-- mySubpackage
| |
| |-- foo.go
|
|-- vendor
|-- github.com
|
|-- Masterminds
|
|-- ... etc.
安裝依賴
glide install
如上的命令將安裝 glide.lock 文件中列出的版本,跳過掃描,除非 glide.lock 文件找不到,它將會執行更新。
直接下載依賴
glide get
除了自動從代碼中解析 import 外,glide 還可以通過 glide get 直接下載代碼中沒有的依賴,與 go get 的用法基本一致。
升級依賴
glide up
glide 會按照語義化版本規則更新依賴包代碼,開發過程中如果需要使用新版代碼,可以執行這個命令。
使用鏡像
當下載 golang.org/x/crypto 時,由於地址被牆,導致 Update failed for golang.org/x/crypto: Cannot detect VCS。這時候可以使用 glide 鏡像的功能,配置可以下載的url,或者映射到本地倉庫。將 golang.org 映射到 github :
$ 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 鏡像配置:
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 裏面,使用時候可以考慮這個功能的優劣。