在上一篇文章中介紹了 Go 的環境配置和包管理的幾種方式。Go 的包管理是一直是爲人詬病之處,從 Go 1.5 引入的 vendor 機制、準官方工具dep,到 Go 1.5 的 go modules,目前爲止還沒一個簡便的解決方案。本文將會介紹 glidehtml
glide 是在 vendor 以後出來的。glide 的依賴包信息在 glide.yaml 和 glide.lock 中,前者記錄了全部依賴的包,後者記錄了依賴包的版本信息git
Glide 掃描應用程序或庫的源代碼以肯定所需的依賴項。要肯定版本和位置(例如forks的別名),Glide會使用規則讀取 glide.yaml 文件。有了這些信息,Glide將檢索所需的依賴項。github
遇到依賴包時,會掃描其導入以肯定依賴關係的依賴關係(傳遞依賴關係)。若是依賴項目包含 glide.yaml 文件,則該信息用於幫助肯定從要使用的位置或版本獲取時的依賴關係規則。還會導入 Godep,GB,GOM 和GPM 的配置。依賴項將導出到 verdor。生成的 glide.lock 文件,包含全部依賴項,包括傳遞依賴項。golang
能夠經過腳本安裝:web
curl https://glide.sh/get | sh
複製代碼
執行以後,將會安裝最新的 release 版本。在 Mac 上,還能夠經過 brew install glide
安裝。bash
$ glide -v
glide version v0.13.2
複製代碼
0.13.2
是當前最新的版本。微信
首先須要進入 GOPATH 中的項目,curl
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
。ide
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 裏面,使用時候能夠考慮這個功能的優劣。