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

aoho發表於2019-02-27

在上一篇文章中介紹了 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: 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 裡面,使用時候可以考慮這個功能的優劣。

推薦閱讀

Go的包管理工具

訂閱最新文章,歡迎關注我的公眾號

微信公眾號

參考

  1. glide docs
  2. Golang依賴管理工具:glide從入門到精通使用

相關文章