Posted at

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

More than 3 years have passed since last update.

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