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 の素晴らしいところだと思います。