3.3 Go語(yǔ)言從入門(mén)到精通:包管理工具之Govendor
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專(zhuān)注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
Govendor 是 Go 的另一個(gè)依賴(lài)包管理工具,它的出現(xiàn)可以避免不同用戶(hù)在 clone
同一個(gè)工程后從外部獲取不同依賴(lài)庫(kù)版本的問(wèn)題,很好的彌補(bǔ)了 GOPATH 包管理的缺陷。govendor 會(huì)將工程需要的依賴(lài)包添加到工程的
vendor 目錄下,并且該目錄中 vendor.json 文件會(huì)保存添加的依賴(lài)包的路徑等信息。
(出于知識(shí)體系的完整性以及對(duì)各類(lèi)包管理工具的全面了解,本文重點(diǎn)只是介紹Govendor 的存在,并不推薦使用它,僅作了解即可。)
1、Govendor 概述
Go 工程的依賴(lài)包經(jīng)常使用 go get 命令來(lái)獲取,例如:go get github.com/spf13/cobra/cobra ,會(huì)將依賴(lài)包下載到 GOPATH 的路徑下。
隨著 Go 的不斷升級(jí),在 Go 1.5版本之后,Go 提供了 GO15VENDOREXPERIMENT 環(huán)境變量(Go
1.6版本默認(rèn)開(kāi)啟該環(huán)境變量)和 Govendor 包管理工具,用于將 go build 時(shí)的應(yīng)用路徑搜索調(diào)整成為當(dāng)前工程/vendor
目錄的方式,有效的解決了不同工程使用自己獨(dú)立的依賴(lài)包目錄。
1.1 Govendor介紹
Govendor 是 Go 1.5版本之后引入包管理工具。
其基本思路是,將引用的外部包的源代碼放在當(dāng)前工程的 vendor目錄下面(類(lèi)似于 Nodejs 的 node_modules 目錄),Go 1.5 以后編譯 Go 代碼會(huì)優(yōu)先從vendor目錄先尋找依賴(lài)包,vendor目錄如果沒(méi)有找到,然后在 GOPATH 中查找,都沒(méi)找到最后在 GOROOT 中查找。
特點(diǎn):
可以采用 govendor add/update 從$GOPATH 復(fù)制現(xiàn)有的依賴(lài)。
如果要忽視 vendor/*/,可采用 govendor 同步恢復(fù)依賴(lài)。
可直接通過(guò) govendor fetch 控制器添加新的依賴(lài)或者更新現(xiàn)有依賴(lài)。
可采用 govendor migrate 實(shí)現(xiàn)系統(tǒng)間遷移。
支持 Linux, OS X, Windows,甚至現(xiàn)有所有操作系統(tǒng)。
支持Git,Hg,SVN,BZR(必須指定一個(gè)路徑)。
1.2 解決的問(wèn)題
不同版本依賴(lài)問(wèn)題:解決不同用戶(hù)在 clone 同一個(gè)工程后從外部獲取不同依賴(lài)庫(kù)版本的問(wèn)題。
遷移問(wèn)題:將 Go 源碼拷貝到當(dāng)前工程的 vendor目錄下,這樣打包當(dāng)前的工程代碼到任意機(jī)器的 $GOPATH/src下都可以通過(guò)編譯,避免項(xiàng)目代碼外部依賴(lài)過(guò)多。遷移后, 無(wú)需再次 go get 拉取外部依賴(lài)包,況且再次 go get 重新拉取的外部依賴(lài)包的版本可能和工程開(kāi)發(fā)時(shí)使用的不一致,將會(huì)導(dǎo)致編譯錯(cuò)誤問(wèn)題。
1.3 常用命令
govendor 提供了很多命令供大家使用,下面列舉了一些常用命令,更多命令可通過(guò) govendor --help 查看。
2、快速入門(mén)
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 命令,會(huì)在項(xiàng)目根目錄下自動(dòng)新建一個(gè) vendor 目錄,并在其中生成vendor.json(存儲(chǔ)包的版本信息)
govendor init
2.3 拉取包
使用 govendor fetch 或 govendor get 命令遠(yuǎn)程拉取外部依賴(lài)包。 例如:
govendor fetch github.com/spf13/cobra/cobra
3、小結(jié)
本文主要是講解了一下 Govendor 的存在以及如何使用,但隨著Go 的不斷壯大,隨之被 Go modules 而取代了,所以不推薦使用 Govendor。下一篇文章將會(huì)對(duì) Go modules 展開(kāi)說(shuō)明,它將作為目前包管理工具的首選,也是必選。