codegangsta/cliでサブコマンドをとらないコマンドをつくる


GoのCLI作成用モジュールのcodegangsta/cli

$ mycmd list
$ mycmd add hoge
$ mycmd remove hoge

のようなサブコマンドを取るのが前提になっているようで、サブコマンドを何も登録しなくてもhelpサブコマンド(サブコマンドごとのhelpを表示するサブコマンド)がデフォルトで設定され、helpも次のように表示される。

$ mycmd -h
NAME:
   mycmd - A new cli application

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

VERSION:
   0.0.0

COMMANDS:
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h           show help
   --version, -v        print the version

サブコマンドいらないのでオプション以外は全部argsとして受け取るようなコマンドを作りたい、でもFlagsとかshow helpの機能は便利なのでcodegangsta/cliを使いたい。

まずはデフォルトのhelpコマンドを無効にする。

func main() {
    app := cli.NewApp()
    app.Name = "mycmd"
    app.HideHelp = true // これ
    app.Action = func(c *cli.Context) {
        log.Println(c.Args())
    }
    app.Run(os.Args)
}

HideHelpをtrueにすると--helpのフラグもなくなるので、こっちは有効にしたい。cli.HelpFlagFlagsに追加する。

app.Flags = []cli.Flag{
    cli.HelpFlag,
}

これで期待通りの動作にはなるんだけど、helpメッセージは相変わらずサブコマンドを取るようなメッセージになるので、これも書き換える。

cli.AppHelpTemplate = `NAME:
   {{.Name}} - {{.Usage}}

USAGE:
   {{.Name}} [options] [arguments...]

VERSION:
   {{.Version}}{{if or .Author .Email}}

AUTHOR:{{if .Author}}
  {{.Author}}{{if .Email}} - <{{.Email}}>{{end}}{{else}}
  {{.Email}}{{end}}{{end}}

OPTIONS:
   {{range .Flags}}{{.}}
   {{end}}
`

これでオプション以外の引数はArgsになってhelpメッセージはこうなる。

$ mycmd --help
NAME:
   mycmd - A new cli application

USAGE:
   mycmd [options] [arguments...]

VERSION:
   0.0.0

OPTIONS:
   --help, -h           show help
   --version, -v        print the version