Rustのclapでバージョンの-Vフラグを消して--versionだけにする方法
やりたいこと
以下のようにclapを使って#[command(version)を使うとコマンドのバージョンを表示するフラグができて便利。
(#[clap(version)]でもOK)
code:rust
use clap::Parser as _;
struct Args {
/// message
my_message: String,
}
fn main() {
let args = Args::parse();
println!("{args:?}");
}
--helpを実行したときに以下のようになる。
code:help
...
-V, --version Print version
だが--versionフラグだけではなく-Vというショートフラグも付くようになる。
-Vがバージョンフラグのデファクトスタンダードかというとそうではないと思っていて、
code:console
$ git -v
git version 2.39.3 (Apple Git-145)
$ git -V
unknown option: -V
...
$ docker -v
Docker version 25.0.3, build 4debf41
$ docker -V
unknown shorthand flag: 'V' in -V
...
その他に-Vではなく-vがバージョンだったのは、VS Codeのcode、Node.jsのnode、npm、gcc、clang、Debian系のapt、brew、limaのように色々とある。 (clapの主張としては-vは--verboseフラグの省略で使うということなのだと思っている。)
そのためclapが-Vを自動でバージョンフラグにされるのは困ることがある。
-Vを消して--versionだけにする方法
以下のようにコメント箇所が変更箇所。
code:rust
use clap::Parser as _;
struct Args {
/// message
my_message: String,
/// Print version
version: (), // この行追加
}
fn main() {
let args = Args::parse();
println!("{args:?}");
}
--helpをしたときに以下の様に--versionフラグだけになる。
code:help
...
--version Print version
-Vの代わりに-vにする方法
それは上記にshort = 'v'をつけて以下のようにすれば良いだけ。
(単純に= 'v'を省略しても良い)
code:rust
/// Print version
version: (), // この行追加
以下のように-vと--versionになる。
code:help
-v, --version Print version
clapバージョン
clap 4.0.32と4.5.1で動作を確認している。
ありがちなエラーと対処
以下のエラーが出る場合は#[command(disable_version_flag = true ...の行の追加忘れの可能性がある。
code:error
assertion left == right failed: Command my-command: ArgAction::Version used without providing Command::version or Command::long_version
right: []
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
その他
, value_parser = clap::value_parser!(bool)を消しても動くが以下の参考コードでは利用されていたので、今後の更新でわかりづらいエラーが出るようになってハマったりする可能性もありそうなのでつけている。
参考
以下のテストコードを参考にしている。
個人的な考え
個人的にはコマンドによってバージョン表示に-vも-Vもありそれらを覚えきるぐらいなら、最初から--versionと打つ方向に倒れている(-VのときにShiftキーを打つストレスがないのとsionの部分は英語で頻出のため早くストレスなく打ちやすい)。
その代わりに、ショートフラグの暗記の領域はjavac -versionやgo versionやopenssl versionのように--versionではないコマンドを覚えることに使っているつもり。