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