Technofara

Golangエンジニア!仕事で必要になって勉強した事とか、新しい事とか色々まとめたりを緩くやります。技術系と思考系だけにしておきます、

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以下に取得する方法は、 Godepsgodo,gb などを使ってね。って事らしいです。

まだ試験的だからってのはあるので今後のバージョンでは
取得とymlなどでのファイル管理とかそういうのが標準搭載されればいいなーと思いました。

配布用、CI用としては1.5のvendoringがあるだけでかなり嬉しいので満足です!

と、適当に調べて適当にまとめた、1.5 vendoringレポートでした。