golang にはパッケージマネージャが無数にあります。
PackageManagementTools · golang/go Wiki · GitHub
Home Articles Blogs Books BoundingResourceUse cgo ChromeOS CodeReview CodeReviewComments CodeTools C...
https://github.com/golang/go/wiki/PackageManagementTools
僕もその一つの gom というのを開発している訳ですが、どれもこれも一長一短でなかなか全ての要望を応えられる物がないのが現状だったりします。ただし、開発者がやりたい事は
今 GOPATH にある、うまくビルドできるバージョンに依存したい
ただこれだけなのです。なんで golang はオフィシャルがこの手のツールを出してくれないんだろう、そう思っていた人も多いと思います。が、それは昨日までの話。
GitHub - golang/dep: Go dependency tool
See the help text for much more detailed usage instructions. Note that the manifest and lock file fo...
https://github.com/golang/dep
でたー!みんな待ってた。そしていつもながら他のツールと名前がバッティングしそうなこの名前の短さ!
使い方も簡単です。まずプロジェクトを作ったら
$ dep init
を実行します。すると lock.json と manifest.jsonGopkg.toml と Gopkg.lock が生成されます。この時点では中身はほぼ空っぽです。試しに以下のコードを書いてみます。
package main
import (
    "github.com/mattn/go-runewidth"
)
func main() {
    println(runewidth.StringWidth("あ"))
}
そして以下を実行。
$ dep ensure
すると lock.json が更新されます。
{
    "memo": "e3dcff295c3782f2465033314eee2342535b0a792a61ebf41e0deeab5747a0e7",
    "projects": [
        {
            "name": "github.com/mattn/go-runewidth",
            "version": "v0.0.1",
            "revision": "d6bea18f789704b5f83375793155289da36a3c7f",
            "packages": [
                "."
            ]
        }
    ]
}
dep status を実行すると、go-runewidth の特定のバージョンで stick されているのが分かるかと思います。では試しに
PROJECT                        CONSTRAINT  VERSION  REVISION  LATEST  PKGS USED
github.com/mattn/go-runewidth  *           v0.0.1   d6bea18   v0.0.1  1  
試しに vendor ディレクトリを削除して、go-runewidth のリポジトリで別ブランチに切り替えておきます。そして再度 dep ensure を実行すると、ちゃんと stick したバージョンがよみがえる!
これや!ワイはこれが欲しかったんや!
今のところ、init と status と ensure と remove しかサブコマンドがありませんが、おそらく今後色々と増えてくるんじゃないかなーと思っています。チョー期待してます。ちなみにいずれ go のサブコマンド(go dep)の様に取り込まれる可能性があるので慎重派の人はしばらくは遊ぶ程度にしておいた方が良さそう。
 
