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
可以通過指令碼安裝:
curl https://glide.sh/get | sh
執行之後,將會安裝最新的 release 版本。在 Mac 上,還可以通過brew install glide
安裝。
$ glide -v glide version v0.13.2
0.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: go-web-practice import: - package: github.com/astaxie/beego version: 1.8.0 - package: github.com/coocood/freecache - package: github.com/garyburd/redigo subpackages: - redis - package: github.com/go-sql-driver/mysql - package: github.com/bitly/go-simplejson - package: github.com/orcaman/concurrent-map - package: golang.org/x/crypto testImport: - package: github.com/smartystreets/goconvey subpackages: - convey
專案的結構
- $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 會按照語義化版本規則更新依賴包程式碼,開發過程中如果需要使用新版程式碼,可以執行這個命令。