Go
golang
gb

[Go] ビルドツール gb を使ってみた

More than 3 years have passed since last update.

http://blog.yohei.org/go-build-tool-gb/


最近、適当にちっさいツール系はGo言語で書いてます。


それをチームにビルドして実行してもらう時にgo getしてもらうの面倒だったので、なんかビルドツール入れて一発でやりたいなーと思って調べてたら、最近は「gb」がいいらしい?ということで使ってみました。


gbとは

詳しくは本家とか、Go言語のDependency/Vendoringの問題と今後.gbあるいはGo1.5このへん見てもらえたらと思います。


インストール

gbをgetしましょう。

$ go get github.com/constabulary/gb/...

gbだけでもいいのですが、vendorプラグインを入れるともっと便利になります。vendorも入れておくと、外部ライブラリA使用する時に依存しているライブラリBも合わせてインストールしてくれます。

$ go get github.com/constabulary/gb/cmd/gb-vendor


使ってみる

本家のUsageみてもらうといいんですが、プロジェクト構成が決まってます。下記のような感じで。

$ pwd

$GOPATH/github.com/USER-NAME
$ mkdir -p project/{src/hello,vendor/src}
$ cd project
$ touch src/hello/main.go
$ tree
.
├── src
│   └── hello
│   └── main.go
└── vendor
└── src

main.goは下記のような感じです。

package main

import "log"

func main() {
log.Println("hello");
}


ビルドする

gbコマンドを使ってビルドします。

$ gb build all

ビルドが完了すると、pkg,binディレクトリができます。binには実行ファイルができているので実行してみましょう。"hello"が表示されますね。

$ /bin/hello

2015/10/30 14:17:35 hello


外部ライブラリを追加する

かなり適当に選んでlogrusを使います。


ライブラリの追加には gb vendor fetch を使います。help見ると他にもコマンドあるのでみてみてください。

$ gb vendor fetch github.com/sirupsen/logrus

fetching recursive dependency github.com/Sirupsen/logrus
fetching recursive dependency gopkg.in/gemnasium/logrus-airbrake-hook.v2
fetching recursive dependency gopkg.in/airbrake/gobrake.v2
$ tree -d
.
├── bin
├── pkg
│   └── darwin-amd64
├── src
│   └── hello
└── vendor
└── src
├── github.com
│   ├── jessevdk
│   │   └── go-flags
│   │   └── examples
│   └── sirupsen
│   └── logrus
│   ├── examples
│   │   ├── basic
│   │   └── hook
│   ├── formatters
│   │   └── logstash
│   └── hooks
│   └── syslog
└── gopkg.in
├── airbrake
│   └── gobrake.v2
└── gemnasium
└── logrus-airbrake-hook.v2

依存関係も解決して諸々vendor/srcにはいりましたね。main.goを下記のように編集します。

src/hello/main.go

package main

import (
log "github.com/Sirupsen/logrus"
)

func main() {
log.WithFields(log.Fields{
"animal": "walrus",
}).Info("A walrus appears")
}

再度ビルドして、実行しましょう。正しく実行できますね。

$ gb build all

github.com/Sirupsen/logrus
hello
$ ./bin/hello
INFO[0000] A walrus appears animal=walrus


チーム内でプロジェクトを共有するとき

vendor/manifest にgbでプロジェクトに追加したライブラリが書いてあります。


なので、vendor/srcは不要となります。

$ cat vendor/manifest

{
"version": 0,
"dependencies": [
{
"importpath": "github.com/Sirupsen/logrus",
"repository": "https://github.com/Sirupsen/logrus",
"revision": "fe6f2b03125e4fcafb21406381010e363a072c80",
"branch": "master"
},
{
"importpath": "github.com/sirupsen/logrus",
"repository": "https://github.com/sirupsen/logrus",
"revision": "fe6f2b03125e4fcafb21406381010e363a072c80",
"branch": "master"
},
{
"importpath": "gopkg.in/airbrake/gobrake.v2",
"repository": "https://gopkg.in/airbrake/gobrake.v2",
"revision": "e5efbe565a5a63d8aafee7efa2f4fdd7f42b7bd3",
"branch": "master"
},
{
"importpath": "gopkg.in/gemnasium/logrus-airbrake-hook.v2",
"repository": "https://gopkg.in/gemnasium/logrus-airbrake-hook.v2",
"revision": "31e6fd4bd5a98d8ee7673d24bc54ec73c31810dd",
"branch": "master"
}
]
}%

.gitignoreファイル的にはになります。

vendor/*

!/vendor/manifest


指定されたライブラリの取得方法

vendorプラグインにはrestoreコマンドがあり、これを実行することで既存ライブラリを取得できます。

$ gb vendor restore


まとめ

gbの使い方学んだ。localpackageとかでも苦しんだけど、まぁ使えそう。


久々のブログだったな。