2020/04/18

[golang]サブコマンドを使う

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`しか実装していないので、残りは自動でやっているのだろう。
表示する順番は、自動が先になっているのかソートされているのか。
`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
print
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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。