2016-05-15 47 views
19

首先我看了這樣的回答:Vendoring in Go 1.6,然後我用它作爲我的榜樣。我應該如何在Go 1.6使用供應商?

我GOPATH是GOPATH="/Users/thinkerou/xyz/",而像如下:

[email protected]:~/xyz/src/ou$ pwd 
/Users/baidu/xyz/src/ou 
[email protected]:~/xyz/src/ou$ ls 
main.go vendor 

現在,我用go get,就變成這樣:

[email protected]:~/xyz/src/ou$ ls 
main.go vendor 
[email protected]:~/xyz/src/ou$ cd vendor/ 
[email protected]:~/xyz/src/ou/vendor$ ls 
vendor.json 
[email protected]:~/xyz/src/ou/vendor$ cd ../.. 
[email protected]:~/xyz/src$ ls 
github.com ou 
[email protected]:~/xyz/src$ cd github.com/ 
[email protected]:~/xyz/src/github.com$ ls 
zenazn 

vendor.json這就是:

{ 
    "comment": "", 
    "package": [ 
     { 
      "path": "github.com/zenazn/goji" 
     } 
    ] 
} 

然後,我應該使用什麼命令?爲什麼沒有用vendor?我的版本是1.6.2。

+0

你試圖用什麼工具來做售貨? '去GET'本身不供應商的軟件包,你可能會想使用這裏列出的工具之一:https://github.com/golang/go/wiki/PackageManagementTools – joelnb

+0

OK,我看過了,非常感謝@joelnb – thinkerou

回答

56

隨着Go1.6,當你閱讀vendoring是內置的。這是什麼意思?只有一件事要記住:

當使用go工具,如go buildgo run,他們第一次檢查,看看是否依賴位於./vendor/。如果是這樣,請使用它。如果不是,請恢復到$GOPATH/src/目錄。

在Go 1.6實際的 「查找路徑」 依次爲:

./vendor/github.com/zenazn/goji 
$GOPATH/src/github.com/zenazn/goji 
$GOROOT/src/github.com/zenazn/goji 

隨着中說,go get將繼續安裝到您$GOPATH/src;並且,go install將安裝到$GOPATH/bin二進制文件或$GOPATH/pkg的包緩存。

所以,我怎麼使用./vendor?!?!

呵呵,上面的知識武裝,這是很簡單的:

mkdir -p $GOPATH/src/ou/vendor/github.com/zenazn/goji 
cp -r $GOPATH/src/github.com/zenazn/goji/ $GOPATH/src/ou/vendor/github.com/zenazn/goji 

總之,使用vendoring,複製使用相同的github.com/zenazn/goji完整路徑的文件,爲您的供應商總監。現在

,旅途中構建/安裝/運行工具將看到和使用您的供應商目錄。

一個簡單的方法,而不是將所有內容複製手動

而不是尋找和複製所有25+供應商的項目,管理它們的版本,更新等項目等等......這將是更好地使用依賴管理工具 。在那裏有很多,一點點谷歌搜索會指向你幾個。

讓我舉兩個是與供應商的文件夾和工作不打你:

  • godep
  • govendor

總之,這些工具將檢查你的代碼ou,發現遠程依賴關係,並將它們複製您的$GOPATH/src您的$GOPATH/src/ou/vendor目錄(實際上,whatev呃當前你所在的目錄)。例如,假設您使用正常的GOPATH/src/github安裝了您的依賴關係,在$GOPATH/src/ou/項目中安裝並正常工作了所有依賴項。您的項目將運行,並且您的測試將驗證所有內容與您擁有的回購站的確切版本一起工作。隨着Godep作爲一個例子,你會從你的項目的根文件夾$GOPATH/src/ou/運行此:

godep save ./... 

這將您的項目使用的所有依賴複製到您的./vendor文件夾。

Godep是迄今爲止最受歡迎的大型產品。他們在Gopher Slack組擁有自己的Slack頻道。而且,這是我在我的團隊中使用的一個。

Govendor是我讀過的另一種選擇,它具有很好的同步功能。我沒有使用它。

在依賴管理工具

這是純粹的意見,我肯定會憎恨...... downvote但是,當我需要完成關於這個問題我的博客文章,讓我在這裏提及的用途,大多數人對Go的偏差管理過分擔心。

是的,有必要鎖定回購到你依賴的版本,這樣你就可以確保你的系統在生產中建立。是的,有必要確保不會中斷某些依賴項的操作。

絕對使用這些依賴管理。

但是,有一個鎖定的依賴在現實中,當大量的簡單項目的過度使用...

您可能只需要鎖定1只依賴;否則,您需要最新版本的MySQL驅動程序並測試斷言框架是否存在錯誤修復。

這是除了使用./vendor/文件夾從依賴managrment工具可以大放異彩:你只需要複製回購需要你鎖定

您有選擇地挑選一個行爲不端回購並把它放到你的./vendor/文件夾中。通過這樣做,你告訴你的消費者:

嘿,這個回購需要在這次修訂中被阻止。所有其他人都很好,並使用最新的和go get -u ./...經常更新;但是,這一個失敗與較新的版本,所以不要升級這一個回購。

但是,如果所有的依賴全面性節能與依賴管理工具,你基本上是告訴你的客戶:

有可能會或可能不會與一個或多個回購了20個問題供應商文件夾。您可能會或可能無法更新它們。您可能會也可能不會獲得最新的MySQL驅動程序。我們根本不知道哪些可能導致問題,也可能不會導致問題,並鎖定在我運行godep save時發揮作用的東西。所以是的,升級需要您自擔風險。

個人而言,我遇到了好幾次。依賴關係隨着突變而更新,我們有數十個依賴於它的repos。在供應商處只提供一個回購協議允許我們使用該版本的依賴關係,而go get ./...可以繼續正常運行以獲得最新的所有其他回購協議。我們運行PSQL和MySQL等最新的錯誤修復程序(這些修復程序經常修復!)等等。

+1

非常感謝@ eduncan911。 – thinkerou

+0

無論如何,如果我不使用其他'依賴管理工具',我應該使用'copy'方法。所以'vendor/vendor.json'文件使用'Dependency Management Tool',而不是使用go命令。實際上,我想使用'vendor',但不想使用'Dependency Management Tool',這需要使用'copy file'方法。 – thinkerou

+0

是的,只要使用相同的'github.com/zenazn/goj'路徑複製文件,比如'供應商/ github.com/zenazn/goj' – eduncan911

相關問題