gitみたいなコマンドは、サブコマンドであれこれできる。
そんな感じのアプリを作りたい。
flagというパッケージがあるのだが、ピンとこなかったのでこちらを使ってみる。
google/subcommands: Go subcommand library.
https://github.com/google/subcommands
標準パッケージではないそうだ。まあいい。
Usageをそのまま貼り付けてコンパイル。
引数無しで実行。
$ go run subcmd.go
Usage: subcmd <flags> <subcommand> <subcommand args>Subcommands:
commands list all command names
flags describe all known top-level flags
help describe subcommands and their syntax
print Print args to stdout.exit status 2
コマンド名がsubcmdなのは、ディレクトリがsubcmdだから、subcmd.goというファイル名だからか。。
main.goにリネーム。
$ go run main.go
Usage: main <flags> <subcommand> <subcommand args>Subcommands:
commands list all command names
flags describe all known top-level flags
help describe subcommands and their syntax
print Print args to stdout.exit status 2
うーん。
$ go run .
Usage: subcmd <flags> <subcommand> <subcommand args>Subcommands:
commands list all command names
flags describe all known top-level flags
help describe subcommands and their syntax
print Print args to stdout.exit status 2
うーーーん・・・。
まだこの辺のルールが理解できていない私であった。
まあ、ここはgolangのことだからいいとしよう。
$ ./subcmd commands
help
flags
commands
`print`しか実装していないので、残りは自動でやっているのだろう。
表示する順番は、自動が先になっているのかソートされているのか。
`print`を`energy`に変更してみる。
$ go run . commands
help
flags
commands
energy
自動が先になっている。
追加した方がどういう順なのかはわからんな。
$ go run . help
Usage: subcmd <flags> <subcommand> <subcommand args>Subcommands:
commands list all command names
energy Print args to stdout.
flags describe all known top-level flags
help describe subcommands and their syntax
ここはソートされるのか。
なお、オプション無しでやcommandsにないパラメータで実行するとhelpと同じ出力+exit status 2だった。
flagsは出力がなかった。
`print`にはあるから、ここのflagsはグローバルなフラグなのだろうか?
先に`print`を見ていこう。
$ go run . print
$ go run . print help
help
$ go run . print --help
print [-capitalize] <some text>:
Print args to stdout.
-capitalize
capitalize output
exit status 2
最後のはエラー扱いなのか。
ということは、こうか。
$ go run . flags print
-capitalize
capitalize output
そういうことか。ただ"all known top-level flags"だから、違う使い方があるのかもしれん。
$ go run . print MomonGa -capitalize
MomonGa -capitalize
$ go run . print -capitalize MomonGa
MOMONGA
後ろに付けるとオプションではない扱いになるのか。
では、多少コードを変更してみよう。
まず、Register()の順序を変更して、`print`を先頭で行うようにする。
$ go run . commands
help
flags
commands
うむ、追加した順番なのだな。
helpも順番通りの方が良い気がするのだが、どうなんだろうね。
でも、CommandGroupというのがあるから、グループにできるのかもしれん。
Register()のところを、こうしてみた。
subcommands.Register(&printCmd{}, "ぷりんと")
subcommands.Register(subcommands.HelpCommand(), "よしお")
subcommands.Register(subcommands.FlagsCommand(), "よしお")
subcommands.Register(subcommands.CommandsCommand(), "ぷりんと")
そうすると、helpがこうなる。
$ go run . help
Usage: subcmd <flags> <subcommand> <subcommand args>Subcommands for ぷりんと:
commands list all command names
print Print args to stdout.Subcommands for よしお:
flags describe all known top-level flags
help describe subcommands and their syntax
第2引数はグループ名で、グループ内でソートされる、と。
たぶんグループ名でもソートされているのだろう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。