Goのパッケージをgit subtreeで管理する

Go 1.5からVendoring機能が使えるようになったので外部パッケージをgit subtreeで管理してみた。

以下のコマンドで対象のリポジトリにパッケージを追加することができる。
--squashをつけると取り込むパッケージのコミットを一つにまとめることができる

# usage: git subtree add --prefix=<prefix> <repository> <ref>
$ git subtree add --prefix=vendor/github.com/zenazn/goji https://github.com/zenazn/goji v0.8.3 --squash

GO15VENDOREXPERIMENTはデフォルトでは無効なのでビルドするときに有効にする必要がある。

$ GO15VENDOREXPERIMENT=1 go build

パッケージを更新するときはpullを使う。

$ git subtree pull --prefix=vendor/github.com/zenazn/goji https://github.com/zenazn/goji v0.9.0 --squash

gitとgoさえあれば誰でもどこでも(ネットワークが使えなくても)ビルドできるので仕事で開発する時なんかに良さげ。

ディレクトリ構成
$ tree
.
├── main.go
└── vendor
    └── github.com
        └── zenazn
            └── goji
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()
}
コミットグラフ
$ git log --graph --oneline 
*   2c05509 Merge commit '082b48ab2b6004bf43e3faa0bda84e9323a2cfce'
|\  
| * 082b48a Squashed 'vendor/github.com/zenazn/goji/' changes from 9a41ab2..ba6c4f2
* |   b3823c4 Merge commit '7fed70cb0d2f008dfc30014f3f4829113b3c34e8' as 'vendor/github.com/zenazn/goji'
|\ \  
| |/  
| * 7fed70c Squashed 'vendor/github.com/zenazn/goji/' content from commit 9a41ab2
* 0da4802 Initial commit