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

在上一篇文章中介紹了 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

安裝 glide

能夠經過腳本安裝:web

curl https://glide.sh/get | sh
複製代碼

執行以後,將會安裝最新的 release 版本。在 Mac 上,還能夠經過 brew install glide 安裝。bash

$ glide -v
glide version v0.13.2
複製代碼

0.13.2 是當前最新的版本。微信

初始化 glide

首先須要進入 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.yamlide

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從入門到精通使用
相關文章
相關標籤/搜索