Golang1.5のvendoringが期待と少し違ったという感想
サンプルでgojiを使って検証してみました。
今までだったら
$ go get github.com/zenazn/goji
とすると
$ ls -d $GOPATH/src/github.com/zenazn/goji /Users/shinofara/go/src/github.com/zenazn/goji
GOPATH以下にダウンロードされて、
こんなmain.go
を用意して
package main import ( "fmt" "net/http" "github.com/zenazn/goji" "github.com/zenazn/goji/web" ) func hello(c web.C, w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"]) } func main() { goji.Get("/hello/:name", hello) goji.Serve() }
$ go run main.go
とかすればOKだったんですが、これだと複数のプロジェクトで開発する時困るんですよね。
例えば趣味は最新のバージョンつかうけど、とあるプロジェクトでは半年前のバージョンだったりとか
でもこの仕組だと上書きされるので、どちらか一つ。。あぁ....
コレは結構前から課題で、Godepsさんが登場したり、godoさんが...gbさんが
だったんですけど、まだコレがデファクト!!的なのはなかったんです。
で、golang1.5になるとvendoring登場!とみてo(´∀`)oワクワクしてたんですけど (ちゃんと嫁系オチですが)
実際golang1.5のvendoring機能の使いかたを書くと
$ tree -L 4 . . ├── main.go └── vendor └── github.com └── zenazn └── goji
こんな感じで、プロジェクトルートにvendorを置いて、その下に$GOPATH/src以下と同じように置けばvendorを優先して読みまっせ!まかせてーな!という感じ
なので期待して
$ go run main.go main.go:7:9: cannot find package "github.com/zenazn/goji" in any of: /usr/local/go/src/github.com/zenazn/goji (from $GOROOT) /Users/shinofara/go/src/github.com/zenazn/goji (from $GOPATH) main.go:8:9: cannot find package "github.com/zenazn/goji/web" in any of: /usr/local/go/src/github.com/zenazn/goji/web (from $GOROOT) /Users/shinofara/go/src/github.com/zenazn/goji/web (from $GOPATH)
よまへんやないか!嘘つきか!
これはvendor以下を一切みないで、GOPATH/src以下を見に行っててないと怒ってるのです。
ではではどうすればいいのか?それは簡単で
$ GO15VENDOREXPERIMENT=1 go run main.go
go15のGO15VENDOREXPERIMENTのフラグを立てるとあら不思議
$ GO15VENDOREXPERIMENT=1 go run main.go 2015/08/22 03:38:36.965105 Starting Goji on [::]:8000
このようにvendor以下を読みにいってくれるのです。 便利ですね?
さて、ではvendor読んでるのだから問題ないのでは?と思うと思いますが、
確かに問題は無いのです、、、が
$ go get
をすると$GOPATH以下に行く.. どうすれば、vendor以下にダウンロードできるのか?
答えは簡単で、1.5の段階ではvendorを使えるcommandはrun, test, build, install, etcのみだそうです。
vendor以下に取得する方法は、 Godeps、godo,gb などを使ってね。って事らしいです。
まだ試験的だからってのはあるので今後のバージョンでは
取得とymlなどでのファイル管理とかそういうのが標準搭載されればいいなーと思いました。
配布用、CI用としては1.5のvendoringがあるだけでかなり嬉しいので満足です!
と、適当に調べて適当にまとめた、1.5 vendoringレポートでした。