glide - パッケージ管理のお困りの方へ -

  • 227
    いいね
  • 0
    コメント
注意: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もいっしょに記載するとバージョン指定もできます。

glide.ymlの例
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だけで事足ります。

install
$ glide install
update
$ 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表示

プロジェクトで参照しているパッケージを一覧を表示することができます。
しかも、vendorgopathかも判定してくれる。(嬉しい)

$ 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年までだよね?
っていう記事が出回る前に皆さん使いましょう。

この投稿は Go その2 Advent Calendar 20156日目の記事です。