3.3 Go語言從入門到精通:包管理工具之Govendor

作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。 






Govendor 是 Go 的另一個(gè)依賴包管理工具,它的出現(xiàn)可以避免不同用戶在 clone 同一個(gè)工程后從外部獲取不同依賴庫版本的問題,很好的彌補(bǔ)了 GOPATH 包管理的缺陷。govendor 會將工程需要的依賴包添加到工程的 vendor 目錄下,并且該目錄中 vendor.json 文件會保存添加的依賴包的路徑等信息。

(出于知識體系的完整性以及對各類包管理工具的全面了解,本文重點(diǎn)只是介紹Govendor 的存在,并不推薦使用它,僅作了解即可。)
1、Govendor 概述

Go 工程的依賴包經(jīng)常使用 go get 命令來獲取,例如:go get github.com/spf13/cobra/cobra ,會將依賴包下載到 GOPATH 的路徑下。

隨著 Go 的不斷升級,在 Go 1.5版本之后,Go 提供了 GO15VENDOREXPERIMENT 環(huán)境變量(Go 1.6版本默認(rèn)開啟該環(huán)境變量)和 Govendor 包管理工具,用于將 go build 時(shí)的應(yīng)用路徑搜索調(diào)整成為當(dāng)前工程/vendor 目錄的方式,有效的解決了不同工程使用自己獨(dú)立的依賴包目錄。
1.1 Govendor介紹

Govendor 是 Go 1.5版本之后引入包管理工具。

其基本思路是,將引用的外部包的源代碼放在當(dāng)前工程的 vendor目錄下面(類似于 Nodejs 的 node_modules 目錄),Go 1.5 以后編譯 Go 代碼會優(yōu)先從vendor目錄先尋找依賴包,vendor目錄如果沒有找到,然后在 GOPATH 中查找,都沒找到最后在 GOROOT 中查找。

特點(diǎn):

可以采用 govendor add/update 從$GOPATH 復(fù)制現(xiàn)有的依賴。
如果要忽視 vendor/*/,可采用 govendor 同步恢復(fù)依賴。
可直接通過 govendor fetch 控制器添加新的依賴或者更新現(xiàn)有依賴。
可采用 govendor migrate 實(shí)現(xiàn)系統(tǒng)間遷移。
支持 Linux, OS X, Windows,甚至現(xiàn)有所有操作系統(tǒng)。
支持Git,Hg,SVN,BZR(必須指定一個(gè)路徑)。

1.2 解決的問題

不同版本依賴問題:解決不同用戶在 clone 同一個(gè)工程后從外部獲取不同依賴庫版本的問題。
遷移問題:將 Go 源碼拷貝到當(dāng)前工程的 vendor目錄下,這樣打包當(dāng)前的工程代碼到任意機(jī)器的 $GOPATH/src下都可以通過編譯,避免項(xiàng)目代碼外部依賴過多。遷移后, 無需再次 go get 拉取外部依賴包,況且再次 go get 重新拉取的外部依賴包的版本可能和工程開發(fā)時(shí)使用的不一致,將會導(dǎo)致編譯錯(cuò)誤問題。

1.3 常用命令

govendor 提供了很多命令供大家使用,下面列舉了一些常用命令,更多命令可通過 govendor --help 查看。
在這里插入圖片描述2、快速入門
2.1 安裝

使用 go get命令快速安裝:

go get -u -v github.com/kardianos/govendor

建議將 $GOPATH/bin 加入到 PATH 中,方便直接使用 govendor 命令。

2.2 初始化

進(jìn)入項(xiàng)目根目錄下執(zhí)行 govendor init 命令,會在項(xiàng)目根目錄下自動新建一個(gè) vendor 目錄,并在其中生成vendor.json(存儲包的版本信息)

govendor init

2.3 拉取包

使用 govendor fetch 或 govendor get 命令遠(yuǎn)程拉取外部依賴包。 例如:

govendor fetch github.com/spf13/cobra/cobra

3、小結(jié)

本文主要是講解了一下 Govendor 的存在以及如何使用,但隨著Go 的不斷壯大,隨之被 Go modules 而取代了,所以不推薦使用 Govendor。下一篇文章將會對 Go modules 展開說明,它將作為目前包管理工具的首選,也是必選。