「任意の文字列や行をハイライトするツールをGo言語で作成してみた」に書いたツールを作成時に、Go言語のコマンドラインツール作成用パッケージとしてurfave/cliを使用した。
その際に、アプリケーションのヘルプメッセージ内のUSAGE
の部分のコマンド名を固定化するための手法を調べたので、解決策を残しておく。
困ったこと
以下のように設定した場合、
app := cli.NewApp()
app.Name = "abc"
abc
コマンドのヘルプメッセージ
$ ./abc -h
NAME:
abc - sample cli
USAGE:
abc [global options] command [command options] [arguments...]
abc
コマンドのサブコマンドaaa
のヘルプメッセージ
$ ./abc aaa -h
NAME:
abc aaa - sample command
USAGE:
abc aaa [command options] [arguments...]
のような出力が得られることになる。
表示されているabc
のうち、最初のabc
以外は、実行時のアプリケーションの名前を参照している。
なので、同じアプリケーションでもリネームされてしまうと
$ mv abc renamed
$ ./renamed -h
NAME:
abc - sample cli
USAGE:
renamed [global options] command [command options] [arguments...]
$ ./renamed aaa -h
NAME:
renamed aaa - sample command
USAGE:
renamed aaa [command options] [arguments...]
のようになってしまい、もとのアプリケーションの使い方が上書きされてしまう。
上書きされたくなかったのでちょっと調べてみた。
解決策
以下を設定することでabc
の部分を固定可能であることがわかった。
app.HelpName = app.Name // 今回はアプリケーション名と同じにした
これによって、実際のアプリケーションの実行名を参照していた部分がapp.HelpName
を参照してくれるため、リネームされても
$ mv abc renamed
$ ./renamed -h
NAME:
abc - sample cli
USAGE:
abc [global options] command [command options] [arguments...]
$ ./renamed aaa -h
NAME:
abc aaa - sample command
USAGE:
abc aaa [command options] [arguments...]
のようになる。