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

2021-09-03 07:07:23 字數 1622 閱讀 8287

**:

隨著go 1.5 release版本的發布,vendor目錄被新增到除了gopathgoroot之外的依賴目錄查詢的解決方案。在go 1.6之前,你需要手動的設定環境變數go15vendorexperiment=1才可以使go找到vendor目錄,然而在go 1.6之後,這個功能已經不需要配置環境變數就可以實現了。

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

那麼查詢依賴包路徑的解決方案如下:

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

乙個庫工程(不包含main的package)不應該在自己的版本控制中儲存外部的包在vendor\目錄中,除非他們有特殊原因並且知道為什麼要這麼做。

在乙個應用中,(包含main的package),建議只有乙個vendor目錄在**庫一級目錄。

上面建議的原因如下:

工程目錄如下:

- vendor/a/在這個例子中,兩個apackage都是完全一樣的,b package在**庫中儲存了a package,在頂級應用**中也引用了a包。

檔案foo.go做了很簡單的事情:

func main()
那麼問題來了,當我們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這個測試工程到本地重現。

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

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

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

glide

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

tp6 不能使用vendor

從thinkphp 5.1.x後vendor的使用方法發生變化,文件又沒有詳細說明。官方真的太坑了!在thinkphp 5.1.x後新版取消了loader import方法以及import和vendor助手函式,推薦全面採用命名空間方式的類以及自動載入機制,如果必須使用請直接改為php內建的incl...

Golang 在Golang中使用json

由於要開發乙個小型的web應用,而web應用大部分都會使用json作為資料傳輸的格式,所以有了這篇文章。包引用import 用於存放資料的結構體type mydata struct這裡需要注意的就是後面單引號中的內容。json item 這個的作用,就是name欄位在從結構體例項編碼到json資料格...

golang 單向管道使用

一直聽說 即注釋的概念,但是一直沒有乙個具體的概念,看到golang中通過單向chan的來做 即注釋的例子 對於單向channel我們可以這樣定義 在os signal 中使用了如下定義notify函式只會對該通道傳送元素值,而不會從該通道接收值。func notify c chan os.sign...