Golang 套件管理工具 Glide

Go-brown-side.sh 套件版本管理已經是各大語言不可或缺的工具,像是 Node.jsnpmPHPComposerRubyRVM 等…,都已經發展很成熟了,但是在 Golang 語言呢,在 Go 1.5 以後的版本,可以透過 GO15VENDOREXPERIMENTGlide 來管理套件版本,在 Go 官方網站也有整理一份 Wiki,開發者可以選一套適合自己的來使用,而今天要介紹這套 Glide,在開始之前,大家先來了解 Go 提出的 vendor experiment

vendor experiment

Golang 1.5 版本提出 vendor experiment 功能,讓每個 Package 都可以擁有自己的 vendor 目錄,當 compiler 要找尋 import package 時,會預設先從 vendor 目錄找起,如果沒有的話就會繼續找 $GOPATH 最後找 $GOROOT。底下來看一個 Project 範例。

example

- $GOPATH/src/github.com/example/foo
  |
  -- main.go
  |
  -- vendor/
       |
       -- github.com/example/bar
在這範例可以看到有主程式 main.go,在 main.go 內 import github.com/example/bar,系統就會把相關 import package 都下載到 vendor 目錄,取代原本會下載到 $GOPATH 目錄,這邊要注意的是,開發中的專案目錄(在這範例是 github.com/example/foo),務必要放在 $GOPATH 目錄內。如果你還在用 go 1.5 版本,請記得加上環境變數 GO15VENDOREXPERIMENT=1,1.6 版本已經預設將 GO15VENDOREXPERIMENT 設定為 1 了,不知道環境變數可以透過 go env 看看目前 go 變數狀態。

Glide 套件管理

Glide 是 golang 套件管理工具,用來管理專案的 vendor 目錄,開發者可以透過 Glide 建議各專案的 glide.yaml 設定檔,並且定義相關套件版本資訊,Glide 會負責將套件下載到 vendor 目錄內。底下是 Glide 安裝方式。

安裝 Glide

安裝 Glide 非常簡單,可以直接到 Github 下載 Binary 執行檔,或者是透過 go 來安裝
$ go get github.com/Masterminds/glide
$ cd $GOPATH/src/github.com/Masterminds/glide && make install

使用 Glide

在專案內直接執行底下指令來建立 glide.yaml 設定檔
$ glide init
# 或
$ glide create
產生出來的 glide.yaml 格式如下
package: github.com/appleboy/gorush
import:
- package: gopkg.in/yaml.v2
- package: gopkg.in/redis.v3
- package: github.com/Sirupsen/logrus
  version: v0.10.0
- package: github.com/appleboy/gin-status-api
- package: github.com/fvbock/endless
- package: github.com/gin-gonic/gin
- package: github.com/google/go-gcm
- package: github.com/sideshow/apns2
  subpackages:
  - certificate
  - payload
- package: github.com/stretchr/testify
- package: github.com/asdine/storm
- package: github.com/appleboy/gofight
- package: github.com/buger/jsonparser
如果原本專案內就有使用 Godep, GPM, or GB 等套件管理,Glide 會自動把該套件無痛整合進來。完成後可以透過 glide upglide install 來安裝相關套件。兩個指令差別在哪?如果專案內沒有 glide.lock 檔案,當您執行 glide install 後,其實系統會先執行 glide up 產生 glide.lock 檔案,glide.lock 內記錄了所以套件版本資訊。你可以把 glide.lock 想像成 PHP 的 composer.lock
hash: 4e05c4dd1a8106a87fee3b589dd32aecc7ffeb1246bed8f8516b32fe745034d6
updated: 2016-05-04T14:26:47.161898051+08:00
imports:
- name: github.com/alecthomas/kingpin
  version: e1543c77ba157565dbf7b3e8e4e15087a120397f
- name: github.com/alecthomas/template
  version: a0175ee3bccc567396460bf5acd36800cb10c49c
  subpackages:
  - parse
也就是專案內使用了 A 套件,A 又使用了 B,這樣 Glide 會把套件 hash 值記錄在 glide.lock 檔案內,其他開發者下載您的專案後,只需要下 glide install 就可以開始 build binary 了。如果要安裝單一套件呢,可以使用 glide get 指令,該指令會將新的套件寫入 glide.yaml 設定檔。
$ glide get --all-dependencies -s -v github.com/gin-gonic/gin
  • --all-dependencies: 下載相依套件全部的 dependencies
  • -s: 下載後刪除 .git 目錄
  • -v: 移除 Godeps/_workspace 等相關目錄
當然你也可以指定套件版號
$ glide get --all-dependencies -s -v github.com/gin-gonic/gin#v1.0rc1
如果是想更新全部 dependencies 寫到 glide.lock,可以直接下底下指令,Glide 會把套件 dependencies 全部下載到 vender 內,就好比執行 go get -d -t ./... 指令一樣。
$ glide update --all-dependencies --resolve-current

結論

使用套件管理後,務必將 glide.lock 加入版本控制,更新時請務必看看各套件的 Changelog,並且將測試寫完整。如果是 API 測試,可以參考之前寫的一篇測試工具 用 gofight 來測試 golang web API handler
  • zyguan

    好文!有一点提一下,我认为ruby下的包管理是Bundler,而非RVM 🙂