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