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

  • 24
    Like
  • 0
    Comment
More than 1 year has 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とかでも苦しんだけど、まぁ使えそう。

久々のブログだったな。