這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go 1.5 vendor/實驗特性出爐後,市面上的go第三方包依賴和管理工具顯然都無法與之相容,除了修改代碼,別無它法。市場佔有率最大的godep做出了表 率,目前其最新版本(go get github.com/tools/godep)已經初步支援了這一實驗特性,即在GO15VENDOREXPERIMENT=1時,將使用vendor 目錄(而不是Godeps目錄)存放copy的第三方包,並在godep go build時不再rewrite GOPATH就可以實現利用vendor下第三方包的構建。下面我們就用例子來驗證一下Godep對vendor的支援。
一、升級godep到最新版本
如果要用到go 1.5 vendor,那麼godep要升級(go get -u github.com/tools/godep;go build github.com/tools/godep)到當前的最新版本“commit d8799f112f6c8dfe1e56142831bc3bb5c8796a0e”。最新版本相容老版本的功能,同時提供對go 1.5 vendor支援,兩者之間轉換的開關就是環境變數:GO15VENDOREXPERIMENT。
當GO15VENDOREXPERIMENT沒有被set時,godep沿用以前的方式;當GO15VENDOREXPERIMENT = 1時,godep將用vendor替代Godeps目錄以存放第三方包,同時go save將無法使用-r命令列選項(-r選項用於重寫源碼中的import path):
$ godep save -r
godep: flag -r is incompatible with the vendoring experiment
二、例子
下面是一個godep的例子(go 1.5 beta3),例子的目錄結構如下:
$(GOPATH)/src/tonybai.com/
├── app
│ └── main.go
└── foolib
└── foolib.go
//foolib.go
package foo
import "fmt"
func Hello() {
fmt.Println("Hello from foolib")
}
//main.go
package main
import "tonybai.com/foolib"
func main() {
foo.Hello()
}
如果GO15VENDOREXPERIMENT沒有被set時,godep的各種命令將按之前的方式執行。
$ godep save
$ godep go build
$(GOPATH)/src/tonybai.com/
├── Godeps
│ ├── Godeps.json
│ ├── Readme
│ └── _workspace
│ └── src
│ └── tonybai.com
│ └── foolib
│ └── foolib.go
├── app*
└── main.go
$./app
Hello from foolib
godep將第三方包放在Godeps/_workspace/src下面。godep go build會rewrite GOPATH以實現使用_workspace下面的第三方包來構建的目的。
如果GO15VENDOREXPERIMENT = 1,那麼godep會按照新的方式執行各種命令:
$ godep save
$ godep go build
$(GOPATH)/src/tonybai.com/
├── Godeps
│ ├── Godeps.json
│ └── Readme
├── app*
├── main.go
└── vendor
└── tonybai.com
└── foolib
└── foolib.go
可以看出godep建立vendor目錄來存放第三方包,Godeps目錄依然保留,但只是存放Godeps.json,以儲存些第三方包的meta資訊:
//Godeps.json
{
"ImportPath": "tonybai.com/app",
"GoVersion": "go1.5beta3",
"Deps": [
{
"ImportPath": "tonybai.com/foolib",
"Rev": "7f2f94dc589ba9e053ef13b3b01fa327c27bf161"
}
]
}
三、遷移
由於godep前後的兩種工作模式並不相容,因此大量存量的使用godep的repo,如果想使用Go 1.5 vendor,那麼在升級到Go 1.5之後需要做一些遷移工作。godep沒有提供自動的遷移工具,目前只能手動遷移,godep github首頁上給出了手動遷移的命令步驟:
$ unset GO15VENDOREXPERIMENT
$ godep restore
//如果之前使用了godep save -r,那麼下面這行命令將自動undo rewritten import。
$ godep save ./…
$ rm -rf Godeps
$ export GO15VENDOREXPERIMENT=1
$ godep save ./…
# You should see your Godeps/_workspace/src files "moved" to vendor/.
2015, bigwhite. 著作權.