這篇文章適合公司、機構內部使用 glide 來管理、或求知慾強到爆的同學。
Oh My God!
我才剛點進來 你就這樣跟我說,這樣對嗎?
Go官方目前主推使用 go module
來管理套件,如果想學主流可以跳過這篇。
不是說 glide 已經不能用了,絕大部分的套件沒有問題、仍然可以穩穩地使用。
go glide
在一年多以前也是主流、一堆人用爆,只不過目前不再更新了。
學習 glide 可以當作 Golang 歷史傳統遺留下來的一些足跡。
glide 套件的作者,在golang官方推gomod來管理之後,
至今已經停止維護一年多了,一點要復活的意思與跡象都沒有。
有些套件的最新版本(套件包名稱後面有/v2 /v3
等等的)已經無法透過glide方式取得了。
例如 :
colly (最新版本v2) => glide只能裝到v1
go-redis (最新版本v8) => glide只能裝到v6
$ go get github.com/go-redis/redis/v8
$ go get github.com/gocolly/colly/v2
這種情況的解決辦法,只能透過go get
、go mod
方式安裝,
或者降低套件版本,不使用最新版本(不要有/v2
字樣的版本)。
Vendor
中文是供應商
。
在Go
專案資料夾底下的Vendor
資料夾中,
放著的是這個專案會用到的lib
依賴,或稱作第三方的套件。
我們可以透過glide這個工具來管理vendor包。
官方文件寫著以下這段:
Please consider using that instead of Glide. Glide is now mostly unmaintained.
顯示現在 go-glide 已經不再被更新、維護了。
未來我會再介紹當前主流用法go module
方式
提供以下數種的安裝方式:
$ brew install glide
$ go get github.com/Masterminds/glide
$ cd ~/go/src/github.com/Masterminds/glide
$ make install
直接下載編譯過後的可執行檔 (對`Windows`來說就是`.exe`檔),
並加入系統環境變數 Path 中。
已經有glide了,接著到自己的開發專案目錄底下執行glide初始化
$ glide init
或
$ glide create
會出現以下的對話訊息,依照給的提示來輸入y/N
執行完畢後會產生出一個 glide.yaml
檔案。
如果程式還沒有任何依賴、用到任何第三方函式庫之前,glide.yaml會長這樣
package: .
import: []
因為在Go程式中第一行開頭是
package
,glide.yaml中第一行也是package
,
Go程式中的package是目前這隻.go程式
隸屬哪個package包,
glide.yaml的package則是專案的位置,表示這個專案的絕對或相對路徑
兩者實際上是不同的東西,別搞混哩。
glide套件
會先掃描你各位程式中的每個程式import到的Library套件
,
然後去幫你各位去下載回來。
如果glide.yaml
中有指定版本,則會幫你各位下載你所指定的版本的Library套件。
如果沒指定、或專案有import套件卻跟本沒寫在glide.yaml中的話,那就只能乖乖下載最新版本。
檔案中指定了你各位要的libiray函式庫、套件
的版本。
使用的是yaml
格式,是一種前凸後翹、凹縮有緻的編排格式。
例如:
我:
- 綽號:"茶哥"
- 錢包:
50元銅板
被刷爆的信用卡
借據
你:
- 綽號:"富二"
- 皮夾:
藍色小朋友
支票
地契
通常只會用到這三種:
雖然沒有硬性規定要用空白或是Tab按鍵,但一份yaml文件內要統一,
要嘛全用兩格Space空白
、要嘛全用四格Space空白
、或者是全用Tab鍵
嚴禁混搭使用,違者記小過一支。
以下是用到gin套件的一個小範例,
第一行要改成你的專案位置及名稱(相對於GOPATH的go/src目錄),或者改用相對路徑(.)
否則會出現The name listed in the config file does not match the current location
glide.yaml
package: github.com/gjlmotea/golang/helloworld
import:
- package: github.com/gin-gonic/gin
version: 1.3.0
helloworld.go (import了gin套件)
package main
import "github.com/gin-gonic/gin"
func main() {
}
$ glide init
幫您產出glide.yaml
檔案。
如果您要自己用Vim
或其他文字編輯器手刻一個glide.yaml也可以!
$ glide up
或
$ glide update
依照yaml檔寫好的規則升級
這會依照glide.yaml配置好規則載套件,下載Library、套件
到當前目錄的 vendor/
底下。
可依照規則來升級版本
若此階段還無glide.lock檔的話,會自動產出glide.lock
檔
可以用編輯器、或cat
指令看一下 glide.lock 這份奇怪的檔案。
這些奇形怪狀的文字是什麼鴨?豪可爬啊大大!
細看的話,會發現是一堆套件、版本、跟Sha256碼。
透過這些,讓glide管理工具 記住你現在這份專案所用到的套件版本資訊,
lock
有直接釘死在這個狀態、做快照的意思。
如果未來用 $ glide install
安裝,就會直接下載變成這個狀態!
哦,對於 glide.lock 中出現了 沒有看過的套件包感到疑惑?
這是因為你所用到的套件包,引用、依賴到了別人的套件包
因為你用到的源頭套件 用到了其他源頭的套件,所以這些也一併被匯入進來(相同地,你今天開發這個專案也是用到 依賴到別人寫好的套件,
待專案完成、開放出去後,其他人也有可能使用到你的這個專案,也會要下載你所用到的套件)
依照glide.lock指定版本安裝
$ glide install
讓Library、套件
變成glide.lock的形狀。
在沒有glide.lock
檔案的情況下運行$ glide install
,則跟運行 $ glide up
結果相同。
清除快取
$ glide cc
有時候莫名其妙遇到坑,可能就是因為快取的關係。
import數個套件的寫法
import:
- package: github.com/gin-gonic/gin
version: 1.3.0
- package: github.com/spf13/viper
version: ^1.6
glide.yaml
- package: github.com/gin-gonic/gin
version: 1.3.0
其中 version是指定1.3.0
,這沒問題。
但如果是 ~1.3.1
或 ^1.3.2
呢?
~
:自動升版(次要版本),如果偵測到github有新的 1.3.x
(fixed bug version) 會自動升上去
ex: 1.3.1 -> 1.3.2
^
:自動升版(主要版本)
ex: 1.3.2 -> 1.4.0
其中 x
或 *
可以被視作任意值。
可參考版本規則
glide工具 用以上的方式來管理Vendor,每個專案底下都會有一包套件,
當要移除套件時,可以直接右鍵刪除 或 rm -r vendor
。
今天若開發A與B兩個專案,都使用、依賴到gin
這個套件,
優點:
.gitignore
加入vendor/
這行,讓套件依賴關係可以只上傳glide.yaml及glide.lock這兩個小小文件檔
缺點:
clone
較大型的專案時,都得$ glide install
下載vendor(可能好一段時間),才能執行程式。