LoginSignup
14
15

More than 5 years have passed since last update.

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

Posted at

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
14
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15