Go中Vendo機(jī)制的使用
1. 介紹
自 Go 1.6 起,vendor 機(jī)制正式啟用,它允許把項(xiàng)目的依賴放到一個(gè)位于本項(xiàng)目的 vendor 目錄中,這個(gè) vendor 目錄可以簡(jiǎn)單理解成私有的 GOPATH 目錄。 項(xiàng)目編譯時(shí),編譯器會(huì)優(yōu)先從 vendor 中尋找依賴包,如果 vendor 中找不到,則再到 GOPATH 中尋找。
2. vendor 目錄位置
一個(gè)項(xiàng)目可以有多個(gè) vendor 目錄,分別位于不同的目錄級(jí)別,建議每個(gè)項(xiàng)目只在根目錄下放置一個(gè) vendor 目錄。
假如有一個(gè) github.com/test/testcase 項(xiàng)目,項(xiàng)目目錄結(jié)構(gòu)如下:
GOPATH/src/github.com/test/testcase/testpackage/main/main.go
其中 main.go 中依賴如下幾個(gè)包:
import (
"golang.org/x/crypto/ssh"
"github.com/pkg/sftp"
)
在沒有使用 vendor 目錄時(shí),若想編譯這個(gè)項(xiàng)目,則 GOPATH 目錄經(jīng)過應(yīng)該如下:
GOPATH/src/github.com/test/testcase/ GOPATH/src/github.com/pkg/sftp GOPATH/src/golang.org/x/crypto/ssh
即所有依賴的包都位于 GOPATH/src 下。
為了把所使用到的 golang.org/x/crypto/ssh 和 github.com/pkg/sftp 版本固化下來(lái),可以使用 vendor 機(jī)制。
在項(xiàng)目 github.com/test/testcase/ 根目錄下創(chuàng)建一個(gè) vendor 目錄,并把 golang.org/x/crypto/ssh 和 github.com/pkg/sftp存放到此目錄中,讓其成為項(xiàng)目的一部分:
GOPATH/src/github.com/test/testcase/testpackage/main/main.go GOPATH/src/github.com/test/testcase/vendor/github.com/pkg/sftp/ GOPATH/src/github.com/test/testcase/vendor/golang.org/x/crypto/ssh/
使用 vendor 的好處是在項(xiàng)目 github.com/test/testcase 發(fā)布時(shí)可以把其所依賴的軟件一并發(fā)布,編譯時(shí)不會(huì)受到 GOPATH 目錄的影響,即便 GOPATH 下也有一個(gè)
同名但不同版本的依賴包。
3. 搜索順序
編譯器會(huì)從源碼文件所在的目錄開始逐級(jí)向上搜索,在上面的例子中,在編譯 main.go 時(shí),編譯器搜索依賴包的順序?yàn)椋?/p>
- 從
GOPATH/src/github.com/test/testcase/testpackage/main/下尋找 vendor 目錄,沒有找到,繼續(xù)從上層查找。 - 從
GOPATH/src/github.com/test/testcase/testpackage/下尋找vendor 目錄,沒有找到,繼續(xù)從上層查找。 - 從
GOPATH/src/github.com/test/testcase/下尋找 vendor 目錄,從 vendor 目錄中查找到依賴包,結(jié)束查找。
如果 GOPATH/src/github.com/test/testcase/ 下的 vendor 目錄中沒有依賴包,則返回 GOPATH 目錄繼續(xù)查找。這就是 GOPATH 機(jī)制了。
實(shí)際上 vendor 目錄可以存在于項(xiàng)目的任意目錄下。但是不推薦,如果 vendor 目錄過于分散,則可能同一個(gè)依賴包在項(xiàng)目的多個(gè) vendor 中出現(xiàn)
多次,這樣依賴包會(huì)多次編譯進(jìn)二進(jìn)制文件,從而造成二進(jìn)制文件的體積急劇增大,也很可能出現(xiàn)一個(gè)項(xiàng)目中使用同一個(gè)依賴包的多個(gè)版本的情況。
4. vendor 的不足
vendor 很好地解決了多項(xiàng)目間的隔離問題,但是也有一些不足之處:
- 項(xiàng)目依賴關(guān)系不清晰,無(wú)法清楚地看出
vendor目錄中依賴包的版本。 - 依賴包升級(jí)時(shí)很不方便審核。
更嚴(yán)重的是二進(jìn)制文件的體積急劇增大的問題,比如項(xiàng)目依賴開源包A和B,但是A中也有一個(gè)vendor目錄,其中也放了B,那么項(xiàng)目中將出現(xiàn)兩個(gè)開源包B。
如果兩個(gè)開源包B的版本不一致或者不兼容,那么后果非??膳?。
vendor 能夠解決大部分項(xiàng)目中的問題,但是也存在很多的不足之處。
到此這篇關(guān)于Go中Vendo機(jī)制的使用的文章就介紹到這了,更多相關(guān)Go Vendo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang中拿slice當(dāng)queue和拿list當(dāng)queue使用分析
這篇文章主要為大家介紹了golang?中拿slice當(dāng)queue和拿list當(dāng)queue使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Go語(yǔ)言中使用 buffered channel 實(shí)現(xiàn)線程安全的 pool
這篇文章主要介紹了Go語(yǔ)言中使用 buffered channel 實(shí)現(xiàn)線程安全的 pool,因?yàn)镚o語(yǔ)言自帶的sync.Pool并不是很好用,所以自己實(shí)現(xiàn)了一線程安全的 pool,需要的朋友可以參考下2014-10-10
golang使用mTLS實(shí)現(xiàn)雙向加密認(rèn)證http通信
這篇文章主要為大家介紹了golang如何調(diào)用mTLS實(shí)現(xiàn)雙向加密認(rèn)證http通信,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下2023-08-08
詳解golang避免循環(huán)import問題(“import cycle not allowed”)
這篇文章主要給大家介紹了關(guān)于golang中不允許循環(huán)import問題("import cycle not allowed")的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Go語(yǔ)言實(shí)現(xiàn)的樹形結(jié)構(gòu)數(shù)據(jù)比較算法實(shí)例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的樹形結(jié)構(gòu)數(shù)據(jù)比較算法,實(shí)例分析了樹形結(jié)構(gòu)數(shù)據(jù)比較算法的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
Go語(yǔ)言Http?Server框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的httpServer
這篇文章主要為大家介紹了Go語(yǔ)言Http?Server框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的httpServer抽象,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Go語(yǔ)言常見設(shè)計(jì)模式之裝飾模式詳解
在?Go?語(yǔ)言中,雖然裝飾模式?jīng)]有像?Python?中應(yīng)用那么廣泛,但也有其用武之地,這篇文章我們就來(lái)一起看下裝飾模式在?Go?語(yǔ)言中的應(yīng)用吧2023-07-07
Golang實(shí)現(xiàn)根據(jù)某個(gè)特定字段對(duì)結(jié)構(gòu)體的順序進(jìn)行排序
這篇文章主要為大家詳細(xì)介紹了Golang如何實(shí)現(xiàn)根據(jù)某個(gè)特定字段對(duì)結(jié)構(gòu)體的順序進(jìn)行排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03

