注意:Goがversion1.5以上じゃないと使えません
glideってなんぞ?
glideはGo1.5以降で使用可能なvendoring機能を利用した。
パッケージ管理ツールです。
(正確にはvendor管理)
glideを使うと下記のようにvendorにプロジェクトに必要なパッケージがインストールされ、そのプロジェクト内でのみ利用が可能となります。
(通常のgo get, go installのようにグローバル管理ではない)
- $GOPATH/src/myProject (プロジェクトのディレクトリ)
|
|-- glide.yaml
|
|-- main.go
|
|-- mySubpackage (サブパッケージ)
| |
| |-- foo.go
|
|-- vendor (この配下がglideで作成されるもの)
|-- github.com
|
|-- Masterminds
|
|-- ... etc.
使いはじめた理由
実は、使いはじめた理由はパッケージ管理ではなく、プライベートリポジトリをきちんと管理したかったから。
同じようにgithubとかstackoverflowとか見てるとどうも皆さんお困りの様子。
中には黒魔術的な方法で回避してたりと...
でいろいろ探してたら、glideの情報を見つけ、これで解決できるのでは!!
と、実際やってみたら見事にできました。
っていうのが 出会い です。
導入方法
Mac
1. glideをインストール
$ brew install glide
2. 環境変数を変更
環境変数でGO15VENDOREXPERIMENT=1
になっていなかったら
以下を.bashrcなどに追加して、反映させる
export GO15VENDOREXPERIMENT=1
※1.6でつかわなくてOKってことだけど、buildでコケることがあるらしいので、おまじない的に残しておいたほうがいいのかも...
http://yoru9zine.hatenablog.com/entry/2016/02/02/054922
Macじゃない
1. glideをインストール
$ go get github.com/Masterminds/glide
$ go install github.com/Masterminds/glide
2. 環境変数を変更
以下を.bashrcなどに追加して、反映させる
export GO15VENDOREXPERIMENT=1
使い方
1. glide.ymlを作成する
glide create
2. glide.ymlを更新する
下記の様な感じで、記載していきます。
package
で管理したいパッケージを指定し、
repo
を同じ階層で指定するとリポジトリをgo get
の取得ルールに従わずに指定のリポジトリから取得するようにできます。
repo
指定するときはvcs
も指定しないと怒られます。
version
もいっしょに記載するとバージョン指定もできます。
package: github.com/Masterminds/glide
import:
- package: github.com/Masterminds/semver
- package: github.com/Masterminds/cookoo
vcs: git
version: ^1.2.0
repo: git@github.com:Masterminds/cookoo.git
3. パッケージをインストールする
installコマンドとupdateコマンドがありますが、
updateだけで事足ります。
$ glide install
$ glide up
きっかけはプライベートリポジトリの問題解決
プライベートリポジトリを解決するには?
bitbucketやstashなど、go get
のルールにマッチしていないURLのサービスがあり、特にプライベートリポジトリなんかは特に厄介です。
glideでこれを解決するにはどうするか?
簡単です!! ( ー`дー´)キリッ
リポジトリを指定するだけです。
へっ? ( ゚д゚)ポカーン
リポジトリを指定するだけです。
package: main
import:
- package: bitbucket.org/foo/bar
vcs: git
repo: git@bitbucket.org:foo/bar.git
これでglide up
したら入ります。
。゚(゚´Д`゚)゚。 (全gopherが泣いた)
Glide使ってる場合の全階層Unitテスト
Golangで全階層でUnitテストかける場合、 go test ./...
っていうことをしますが、
glideが入ってる場合、これだとvendorの中までかかってしまい散々なことになります。
なので、みんなコマンド作ってaliasにしたり、shell作ったりと必死こいてるわけですが、
実は下記のようにしたらvendor以外をテストできます。
(いつの間にやら公式に載ってた)
go test $(glide novendor)
※ novendor
はvendorいがいのパッケージを一覧表示するものです。
邪道かも?でも便利な使い方
リポジトリを変えた時に 一時的にですが!! 影響範囲がわかんないから、パッケージ名をそのままにしたい時ありますよね?
そんな時もパッケージ指定で解決します。
package: main
import:
- package: bitbucket.org/foo/bar
vcs: git
repo: git@github.com:foo/bar.git
もう、glide使ってない人が不憫でしょうがない...
あってよかった、list表示
プロジェクトで参照しているパッケージを一覧を表示することができます。
しかも、vendor
かgopath
かも判定してくれる。(嬉しい)
$ glide list
github.com/Masterminds/cookoo (Location: vendored)
github.com/Masterminds/cookoo/io (Location: vendored)
github.com/Masterminds/glide/cmd (Location: gopath)
github.com/Masterminds/glide/gb (Location: gopath)
github.com/Masterminds/glide/util (Location: gopath)
github.com/Masterminds/glide/yaml (Location: gopath)
github.com/Masterminds/semver (Location: vendored)
github.com/Masterminds/vcs (Location: vendored)
github.com/codegangsta/cli (Location: vendored)
gopkg.in/yaml.v2 (Location: vendored)
意外と便利、tree表示
tree コマンドなくなるっぽい (´;ω;`)ブワッ
=> 残留決まったらしいですヽ(=´▽`=)ノ
プロジェクトの依存パッケージを見たい時ってありますよね?
えっ、ない?
いや、あるって!!
そんな時に便利なtree表示のコマンドがglideにはあります。
$ glide tree
github.com/Masterminds/glide
github.com/Masterminds/cookoo (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo)
github.com/Masterminds/cookoo/io (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/io)
github.com/Masterminds/glide/cmd (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/cmd)
github.com/Masterminds/cookoo (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo)
github.com/Masterminds/cookoo/io (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/io)
github.com/Masterminds/glide/gb (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/gb)
github.com/Masterminds/glide/util (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/util)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
github.com/Masterminds/glide/yaml (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/yaml)
github.com/Masterminds/glide/util (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/util)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
gopkg.in/yaml.v2 (/Users/mfarina/Code/go/src/gopkg.in/yaml.v2)
github.com/Masterminds/semver (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/semver)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
github.com/codegangsta/cli (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/codegangsta/cli)
github.com/codegangsta/cli (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/codegangsta/cli)
github.com/Masterminds/cookoo (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo)
github.com/Masterminds/cookoo/io (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/cookoo/io)
github.com/Masterminds/glide/gb (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/gb)
github.com/Masterminds/glide/util (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/util)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
github.com/Masterminds/glide/yaml (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/yaml)
github.com/Masterminds/glide/util (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/util)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
gopkg.in/yaml.v2 (/Users/mfarina/Code/go/src/gopkg.in/yaml.v2)
github.com/Masterminds/semver (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/semver)
github.com/Masterminds/vcs (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/Masterminds/vcs)
github.com/codegangsta/cli (/Users/mfarina/Code/go/src/github.com/Masterminds/glide/vendor/github.com/codegangsta/cli)
後記
glide使っていないっていうのは2016年までだよね?
っていう記事が出回る前に皆さん使いましょう。