【Golang】cli と gox でコマンドラインツールを作る

cliとgoxでコマンドラインツールを作ってみたら, 予想以上に開発が捗ったので備忘録を残しておきます。
環境はOSX10.10.1(Darwin 14.0.0)です。

cli

cli-packageはコマンドラインツールを作るためのutilityです。

$ go get github.com/codegangsta/cli

Exampleそのまま。

package main

import (
	"github.com/codegangsta/cli"
	"os"
)

func main() {
	app := cli.NewApp()
	app.Name = "greet"
	app.Usage = "fight the loneliness!"
	app.Action = func(c *cli.Context) {
		println("Hello friend!")
	}

	app.Run(os.Args)
}

$GOPATH/binにインストールしてみます。

$ go install
$ which greet
$GOPATH/bin/greet
$ greet
Hello friend!

helpの表示も良い感じです。

$ greet --help
NAME:
   greet - fight the loneliness!

USAGE:
   greet [global options] command [command options] [arguments...]

VERSION:
   0.0.0
...

Argumentsの拾い方。

	app.Flags = []cli.Flag{
		cli.StringFlag{Name: "conf, c", Usage: "use configuration file"},
	}

	app.Action = func(c *cli.Context) {
		println(c.String("conf"))
	}
$ greet --conf example.json
example.json

サブコマンドのハンドリングの仕方。

	app.Commands = []cli.Command{
		{
			Name:      "add",
			ShortName: "a",
			Usage:     "add a task to the list",
			Action: func(c *cli.Context) {
				println("added task: ", c.Args().First())
			},
		},
	}
$ greet add task
added task:  task

cli-init

cli-initを使うと簡単にprojectのsetupを行うことができます。

$ go get -d github.com/tcnksm/cli-init
$ cd $GOPATH/src/github.com/tcnksm/cli-init
$ make install 

sオプションでサブコマンドを指定します。以下のようにファイルが生成されます。

$ cli-init -s add,list,delete word
$ ls 
CHANGELOG.md  commands.go   word.go   README.md   version.go

gox

goxはクロスコンパイルツールで, 導入含めてGCCのクロスコンパイルより圧倒的に簡単です。

$ go get github.com/mitchellh/gox
$ sudo gox -build-toolchain
The toolchain build can't be parallelized because compiling a single
Go source directory can only be done for one platform at a time. Therefore,
the toolchain for each platform will be built one at a time.

--> Toolchain: darwin/386
--> Toolchain: darwin/amd64
--> Toolchain: linux/386
--> Toolchain: linux/amd64
--> Toolchain: linux/arm
--> Toolchain: freebsd/386
--> Toolchain: freebsd/amd64
--> Toolchain: openbsd/386
--> Toolchain: openbsd/amd64
--> Toolchain: windows/386
--> Toolchain: windows/amd64
--> Toolchain: freebsd/arm
--> Toolchain: netbsd/386
--> Toolchain: netbsd/amd64
--> Toolchain: netbsd/arm
--> Toolchain: plan9/386

osarchオプションでOS, CPUを指定します。

$ gox --osarch "linux/arm darwin/amd64"
$ file greet_darwin_amd64 
greet_darwin_amd64: Mach-O 64-bit executable x86_64
$ file greet_linux_arm 
greet_linux_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped

Linux と OSX の異なる実行ファイルが生成されていることを確認できました。

コンパイル型言語でこの生産性の高さが Golang の素晴らしいところだと思います。