前回書いた “Golang1.5で試験追加になったvendoringの使い方” https://shinofara.github.io/2015/09/27/Golang15s-vendoring.html

では、1.5になってやっと公式サポートされたvendoring機能(参照のみ)の使い方を書きましたが、開発現場では参照だけではなくfetchしたりupdateしたりと依存するものを取得するという行動が発生する為、このままでは不便なままです。。ホント

なので、今回は実行時のvendorサポートではなく、開発時のvendor管理の仕方で、自分的にこれが一番やりやすいなと思うことをまとめていきます。

The Best of vendoring management tool is ...

Godepsgodoではなく glideです

glideの公式ドキュメントには下記が書かれています

The Lightweight Vendor Package Manager for Go

https://github.com/Masterminds/glide

glideと1.5のvendoring機能を使った管理の仕方

glideをinstall

go getgo installで依存するパッケージを取得して、実行ファイルかしちゃいます。 go installする事で、$GOPATH/bin/glideファイルが作成されるはずですので、PATHを通してくだい。

$ go get github.com/Masterminds/glide
$ go install github.com/Masterminds/glide
$ ls $GOPATH/bin/glide
/Users/shinofara/go/bin/glide

依存の管理を行うyamlを作成

workspaceで、依存管理用のglide.yamlを作成します rubyで言うGemfileの様なものです

$ cd /path/to/workspace
$ glide create 
[INFO] Initialized. You can now edit 'glide.yaml'

依存パッケージの取得

前回同様gojiで動作検証してみます gojiを動かすためには、まずはgojiパッケージが必要ですので、glideで取得します

glide get github.com/zenazn/goji

[INFO] Checking dependencies for updates. Godeps: false, GPM: false, gb: false
[INFO] Inspecting /Users/shinofara/go/src/vendorsample/vendor.
[INFO] Looking in /Users/shinofara/go/src/vendorsample/vendor/github.com/zenazn/goji for a glide.yaml file.
[INFO] Package github.com/zenazn/goji manages its own dependencies.

この時、glide.yamlにはgojiを使うぜ!と書かれているはずです!

$ cat glide.yaml
package: main                      
import:                            
  - package: github.com/zenazn/goji

↑の例では、デフォルトはmasterを参照していますが、場合によっては特定のcommitだったりtag,branchを参照したいなどがあると思います。その場合はrefを使います。 ※yamlからfetchする方法は後述します。

$ cat glide.yaml
package: main                      
import:                            
  - package: github.com/zenazn/goji
    ref: 46b46e00f46dda650e04f0bceeb7c40732cd5988

vendorパッケージを使って動かす

glide getしたので動かして見ましょう。 この時のmain.gohttps://github.com/zenazn/goji のREADMEを参考にしています。

$ go run main.go
main.go:7:10: cannot find package "github.com/zenazn/goji" in any of: 

前回も書きましたが、このままだとGOPATH以下しか参照しないので、パッケージないやんか!と怒られます。

ので、環境変数にvendorを使うフラグを追加

export GO15VENDOREXPERIMENT=1
$ go run main.go 
2015/09/27 11:17:53.095608 Starting Goji on [::]:8000

vendoer以下を参照して実行されるようになったはずです。

yamlにかかれたパッケージを総取得してみる

ここまでの確認だとyamlって書いてるだけやん? ref書いたけど、そのバージョンとれてないやん? となってしまうので、ここからはyamlに書かれた依存を取得する流れを記述

ので、一旦vendorディレクトリには消えてもらいましょう

$ rm -r vendor/

treeで証拠を

$ tree -L 4 .
.                    
├── glide.yaml                 
└── main.go      

yamlのある階層でglide upを実行します

$ glide up 
[INFO] Fetching updates for github.com/zenazn/goji.                                                       
[INFO] Setting version for github.com/zenazn/goji.                                                        
[INFO] Checking dependencies for updates. Godeps: false, GPM: false, gb: false                            
[INFO] Inspecting /Users/yshinoha/go/src/vendorsample/vendor.                                             
[INFO] Looking in /Users/yshinoha/go/src/vendorsample/vendor/github.com/zenazn/goji for a glide.yaml file.
[INFO] Package github.com/zenazn/goji manages its own dependencies.               

treeで確認

$ tree -L 4 .
.                    
├── glide.yaml         
├── main.go          
└── vendor           
    └── github.com   
        └── zenazn   
            └── goji 

これでyamlに書かれた依存パッケージをvendor以下に取得する事が出来ました。

まとめ

今までは複数人で開発する場合、それぞれがgo getしてたり、github上にvendorすべてcommitしてたりしてたと思うんですが、前者だと開発者によってgo getしたパッケージのバージョンが違ってしまって、環境の再現ができなかっあtり、後者だとgithubにvendorが含まれ差分がでかくなってしまったりする問題がありました。

それが、glideとgo1.5のvendoringを使う事で glide.yamlを管理するだけで、あとはglide upと環境の再現もやりやすくなると感じました。

まぁ今後公式でglideの領域もサポートすればさらに嬉しいのですが、今はこんなところかと個人的に感じています