golang使用vendor目錄來管理依賴包

原文地址:http://www.gaoxuan1989.com/2017/07/10/golang-vendor-mange-dependices/

Vendor目錄介紹

隨著Go 1.5 release版本的發布,vendor目錄被添加到除了GOPATHGOROOT之外的依賴目錄查找的解決方案。在Go 1.6之前,你需要手動的設置環境變量GO15VENDOREXPERIMENT=1才可以使Go找到Vendor目錄,然而在Go 1.6之后,這個功能已經不需要配置環境變量就可以實現了。

Note,即使使用vendor,也必須在GOPATH中,在go的工具鏈中,你逃不掉GOPATH

那么查找依賴包路徑的解決方案如下:

  • 當前包下的vendor目錄。
  • 向上級目錄查找,直到找到src下的vendor目錄。
  • GOPATH下面查找依賴包。
  • GOROOT目錄下查找

一些建議

在使用vendor中,給出如下建議:

  1. 一個庫工程(不包含main的package)不應該在自己的版本控制中存儲外部的包在vendor\目錄中,除非他們有特殊原因并且知道為什么要這么做。
  2. 在一個應用中,(包含main的package),建議只有一個vendor目錄在代碼庫一級目錄。

上面建議的原因如下:

  • 在目錄結構中的每個包的實例,即使是同一個包的同一個版本,都會打到最終的二進制文件中,如果每個人都單獨的存儲自己的依賴包,會迅速導致生成文件的二進制爆發(binary bloat)
  • 在一個目錄的某個pacage類型,并不兼容在同一個package但是在不同目錄的類型,即便是同一個版本的package,那意味著loggers,數據庫連接,和其他共享的實例都沒法工作。

舉個例子

工程目錄如下:

- $GOPATH/src/github.com/mattfarina/golang-broken-vendor
  - foo.go
  - vendor/
    - a/
    - b/
        - vendor/a/

在這個例子中,兩個a package都是完全一樣的,b package在代碼庫中保存了a package,在頂級應用代碼中也引用了a包。

文件foo.go做了很簡單的事情:

func main() {
    var it a.A
    it = "foo"

    b.Do(it)
}

那么問題來了,當我們build的時候,發現出問題了,返回了下面的錯誤:

$ GO15VENDOREXPERIMENT=1 go build
./foo.go:12: cannot use it (type "github.com/mattfarina/golang-broken-vendor/vendor/a".A) as type "github.com/mattfarina/golang-broken-vendor/vendor/b/vendor/a".A in argument to b.Do

你可以clone這個測試工程到本地重現。

為什么用vendor目錄

如果我們已經使用GOPATH去存儲packages了,問什么還需要使用vendor目錄呢?這是一個很實戰的問題。

假如多個應用使用一個依賴包的不同版本?這個問題不只是Go應用,其他語言也會有這個問題。

vendor目錄允許不同的代碼庫擁有它自己的依賴包,并且不同于其他代碼庫的版本,這就很好的做到了工程的隔離。

推薦

Glide

我們發現Glide是非常好的包管理解決方案,他將依賴包平展開存放在頂級vendor目錄中,如果一個包被另一個程序引用了,那么這個包最好不要存儲外部依賴項。如果使用Glide,你可以在glide.yml文件中指定依賴包,Glide會幫你管理,并使用正確的版本。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 包管理的重要性不言而喻。隨著項目的推進,沒有合適的包管理,每一次迭代都將成為開發者的噩夢。尤其是對于進行持續集成的...
    suoga閱讀 4,496評論 4 10
  • [TOC] 介紹 godep是解決包依賴的管理工具,目前最主流的一種,原理是掃描記錄版本控制的信息,并在go命令前...
    木貓尾巴閱讀 17,695評論 0 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,767評論 25 708
  • 聲明:本文僅限于簡書發布,其他第三方網站均為盜版,原文地址: golang 中的包管理 對于習慣了 Java 和 ...
    liuliqiang閱讀 5,340評論 0 3
  • 使用Git提交代碼時,遇到missing Change-Id in commit message footer 會...
    shineYES閱讀 8,930評論 0 1