起因
本來對於Golang的vendoring都是統一使用godep(如果比較大的專案),比較小的專案都直接使用go get
來抓取dependency package.
但是由於Google Code在2016/01/25關閉了,所以常用的uuid沒得抓了.所以來試試看Go 1.5 開始的vendor experiment,順便做點記錄.
什麼是vendor experiment?
一般而言我們在使用Golang套件的時候都是很簡單的直接使用
import "github.com/kkdai/coapmq"
這樣只要編譯專案前先跑 go get -d
就會把所有的相依專案都抓取最新的程式碼到你的GOPATH
. 現在問題來了:
- 引用的專案已經被砍掉了?
- 引用的專案原作者或是維護團隊忽然決定大改API?
- 引用的專案忽然出現意外的錯誤(break code)? (當然有可能是底層API被Google改掉)
- 想要維護整個專案的穩定度
根據以上的需求或是要避免以上的一些問題.將你的專案Vendoring是必要的.而Vendoring的做法一般就是放一份你目前使用的相依套件的程式碼到 vendor
目錄底下. 有可能是這樣
- vendor
- github.com
- kkdai
- coapmq
- photomgr
開始將你的專案轉換成可以使用vendor experiment
假設你現在有一個專案裡面用到了數個相依的套件(ex: mysql,uuid (注意此鏈結已經失效) … )
建議流程如下:
確認你的專案是在GOPATH底下
不論是GO15VENDOREXPERIMENT還是govendor都是使用在GOPATH才能作用.所以請注意:
- 專案一定要放GOPATH底下
- 專案一定要放GOPATH底下
- 專案一定要放GOPATH底下
如果不在GOPATH底下,將不會work.我想這也是godep或是GB能夠繼續讓大家熱愛的原因.
設定GO15VENDOREXPERIMENT=1
一開始得把這個flag打開,你可以先使用go env
來查詢該flag是不是有開啟的狀態(初始是關閉,但是Go 1.6將會打開)
- Mac/Ubutu:
export GO15VENDOREXPERIMENT=1
- Windows:
set GO15VENDOREXPERIMENT=1
將你相依的專案列出來
這裡使用的是govendor,透過他可以將所有相依的專案.流程如下:
govendor init
來初始化,並且將所有的專案寫入vendor.json裡面.- 這時候你可以透過
govendor list
來列出所有的相依專案,然後決定哪個要放入vendor資料夾 - 假設你要把
github.com/kkdai/coapmq
放入vendor目錄中,就執行以下govendor add github.com/kkdai/coapmq
依序把你需要的專案放在目錄中,然後就可以了.
如何透過Vendoring Experiment編譯檔案
將你需要的專案抓到GOPATH
底下(必須),然後切記GO15VENDOREXPERIMENT=1
,其實就簡單地跑go get
然後go build
就可以了.
其他Vendoring的用法
其實還有其他方式,不論是Godep或是GB 其實都各有愛護者,不過用的習慣與相關的使用場景是比較重要的.