天天看點

Golang官方依賴管理工具:dep

第三方依賴管理很多,雖然很好用,但是很少可以相容的,結果--亂;

官方的包管理為了增加社群的凝聚力,保持Go開箱即用的簡單特性,不需要大家再安裝各種第三方工具了,而且第三方工具都會過來相容官方版的;

還有一個官話,為了go更好的發展;

下面進入教程。

dep是一個原型依賴管理工具,需要在Go 1.7及更高的版本中使用,說明第三方工具近期還是有市場的。

PS:本部落格的<code>dep</code>基于v0.3。

等到<code>dep</code>正式內建到Golang中時候,也許是Golang 1.10 ,廣大吃瓜群衆就可以直接使用<code>go dep</code>指令。現在還是需要自己安裝的。

有一個很重要的選項<code>ensure</code>中文含義是<code>確定;保證;擔保</code>,作者想傳達的意思是<code>確定所有本地狀态-代碼樹、清單、鎖和供應商彼此同步</code>。

看到這個說明已經安裝好了。

老規矩,篇幅有限,我隻介紹經常使用到的。 先進入在GOPATH的一個項目中。

大家發現了,應用foordep目錄下出現了兩個檔案(Gopkg.lock、Gopkg.toml)和一個目錄(vendor)。 它們是什麼關系呢?

Golang官方依賴管理工具:dep

是以出現<code>Gopkg.toml and Gopkg.lock are out of sync.</code>時候最好執行一下<code>dep ensure</code>。

下面看看它們的内容。

我們寫一個<code>Gopkg.toml</code>看看效果。

但是怎麼樣執行?可以執行如下指令尋找幫助:

執行一下

錯誤了,這是因為foordep目錄下沒有任何的go代碼,隻能加上一個看看。

再來試試看。

看看Gopkg.lock的内容。

現在需要解析json,我們試試使用指令行的方式導入<code>github.com/bitly/go-simplejson</code>包。

可以發現多了<code>github.com/bitly/go-simplejson</code>,但是<code>Gopkg.toml</code>并沒有任何改變。 注意:執行<code>dep ensure -add</code>時候報錯

還可以指定依賴的版本:

是因為<code>Gopkg.toml</code>和<code>Gopkg.lock</code>不同步了,需要重新執行一下<code>dep ensure</code>即可。 重新整理一下<code>Gopkg.toml</code>。

<code>Gopkg.toml</code>的<code>version</code>規則: <code>~</code>和<code>=</code>是<code>version</code>使用的操作符規則,如果僅僅是指定<code>version = "1.8.0"</code>,那麼<code>dep</code>會自動加上<code>^</code>,表示最左邊的非零位的版本<code>加一</code>。

如果執行<code>dep ensure</code>時候出現

說明配置寫錯了,需要看看<code>Gopkg.toml</code>檔案中是不是同時配置了<code>version</code>、<code>branch</code>和<code>revision</code>。

我們現在嘗試着把<code>foordep</code>目錄情況就留下<code>main.go</code>

執行<code>dep ensure</code> 為了更好地看到過程,加上參數<code>-v</code>。

此時再檢視<code>Gopkg.toml</code>和<code>Gopkg.lock</code>檔案:

與<code>glide</code>一樣,具有<code>自舉</code>功能,不知道這個名詞用得對不對。<code>dep</code>會自動根據代碼生成<code>Gopkg.toml</code>和<code>Gopkg.lock</code>配置檔案。

PS:但是不建議使用,因為其拉取的依賴包都是最新的,可能出現不相容,再者我國是一個<code>被牆</code>的地方。

看到這裡時候很多人都會有疑問?<code>dep</code>的依賴包每一次都是拉取新的還是優先使用本地cache呢?可以肯定的是 <code>dep</code>也是有本地緩存的,大家可以打開<code>$GOPATH/pkg/dep/</code>看看,是不是存在呢!

下面我們做兩個測試看看。

環境準備,将原來的cache和vendor清空,别遺漏了<code>$GOPATH/src</code>中的<code>github.com/bitly/go-simplejson</code>。

執行<code>dep init -gopath -v</code>檢視初始化過程。

日志顯示,<code>dep</code>首先從$GOPATH查找<code>github.com/bitly/go-simplejson</code>,因為沒有找到才從網絡下載下傳。

環境準備,将原來的cache和vendor清空,注意<code>$GOPATH/src</code>中的<code>github.com/bitly/go-simplejson</code>存在。

可以看到<code>github.com/bitly/go-simplejson</code>是優先從<code>$GOPATH</code>擷取的。 好處我個人認為有兩個:

節省時間;

本地類庫的穩定性和相容性已經經過使用者驗證了。

在<code>dep v0.1</code>時候還不需要手動加上<code>-gopath</code>選項,<code>dep</code>工具會自動判斷,但是<code>dep v0.3</code>後如果沒有加上<code>-gopath</code>那麼預設就是從網絡下載下傳。

現在修改<code>foordep</code>項目的<code>Gopkg.toml</code>内容為:

看到了這裡,那麼對<code>dep</code>已經可以進行基本的使用了,不過目前而言,<code>dep</code>還不夠穩定,誰也不知道後續會怎麼樣更改,嘗鮮可以,個人還不建議使用線上上。 如果大家喜歡這篇博文請<code>點贊</code>或者<code>留言</code>,有不同見解的也請<code>留言</code>讨論。

本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1954603