起源
最早的時(shí)候,Go所依賴的所有的第三方庫(kù)都放在GOPATH這個(gè)目錄下面。這就導(dǎo)致了同一個(gè)庫(kù)只能保存一個(gè)版本的代碼。如果不同的項(xiàng)目依賴于同一個(gè)第三方的庫(kù)的不同版本,應(yīng)該怎么解決?
答案是把第三方庫(kù)復(fù)制到項(xiàng)目中去。同時(shí)需要重寫(xiě)import的路徑,也就是把原本依賴的GOPATH下面的路徑改寫(xiě)成項(xiàng)目的路徑。如果第三方庫(kù)本身還依賴于別的項(xiàng)目,情況就變得更加復(fù)雜。更加蛋疼的是,同一套的代碼,在不同的機(jī)器上,由于機(jī)器上第三方庫(kù)版本的不同,會(huì)產(chǎn)生不同的行為。這在多人合作的項(xiàng)目中是沒(méi)辦法接受的。
轉(zhuǎn)機(jī)
到了Go1.5版本,終于出現(xiàn)了轉(zhuǎn)機(jī)。官方支持了vendor機(jī)制。
所謂支持vendor,其實(shí)就是在每個(gè)項(xiàng)目中增加了一個(gè)特殊的名叫vendor的目錄。
Go在引入的時(shí)候,會(huì)按照以下順序去尋找第三方庫(kù)。
- 當(dāng)前包下的vendor目錄。
- 向上級(jí)目錄查找,直到找到src下的vendor目錄。
- 在GOPATH下面查找依賴包。
- 在GOROOT目錄下查找
這種機(jī)制給了每個(gè)項(xiàng)目多一點(diǎn)的自主權(quán),他們?cè)僖膊挥每凑麄€(gè)Go環(huán)境的臉色了,終于擁有了自己選擇自己想要的第三方庫(kù)版本的自由。
管理
出現(xiàn)了vendor機(jī)制后,就涌現(xiàn)出了許多包管理工具。這些工具的基本原理大致相同。
- 解析項(xiàng)目中依賴的第三方庫(kù);
- 指定第三方庫(kù)所用版本;
- 拉取第三方庫(kù)代碼到vendor目錄下。
問(wèn)題
目前這種解決方式存在一個(gè)問(wèn)題,就是會(huì)產(chǎn)生大量第三方庫(kù)的副本。當(dāng)然,現(xiàn)在機(jī)器配置基本上不在乎這些硬盤(pán)消耗,所以這個(gè)問(wèn)題大概也不是什么大問(wèn)題。因此,官方似乎也沒(méi)打算花力氣解決這個(gè)問(wèn)題。