包含长选项而不包含用于帮助和版本的短选项
Include long options without short options for help and version
我想包含 --help
和 --version
多头选项,而不包含 -h
和 -V
空头选项。这可能吗?
我正在使用 clap 和 yaml。我能想到的最接近的方法是使用隐藏的(未使用的)参数来掩盖短选项。
# main.rs
use clap::{load_yaml, App};
fn main() {
let y = load_yaml!("cli.yaml");
let m = App::from_yaml(y).get_matches();
println!("_help {}", m.is_present("_help"));
println!("_version {}", m.is_present("_version"));
}
# Cargo.toml
[package]
name = "app"
version = "0.0.1"
edition = "2018"
[dependencies]
clap = {version = "~2.33.0", features = ["yaml"]}
# cli.yaml
name: app
version: 0.0.1
args:
- opt: { short: "o", long: "opt" }
- _help: { short: "h", hidden: true }
- _version: { short: "V", hidden: true }
$ cargo -q run -- --help
app 0.0.1
USAGE:
app [FLAGS]
FLAGS:
--help Prints help information
-o, --opt
--version Prints version information
$ cargo -q run -- -h
_help true
_version false
$ cargo -q run -- -o
_help false
_version false
$ cargo -q run -- -V
_help false
_version true
$ cargo -q run -- -x
error: Found argument '-x' which wasn't expected, or isn't valid in this context
USAGE:
app [FLAGS]
For more information try --help
感觉这不是一个非常干净的方法。有another/better方式吗?
Clap 更倾向于创建 args 解析器。因此,获取和删除现有参数的功能并不多。
如果您只是想将 "-h"
重命名为例如"-?"
,那么你可以用 help_short("-?")
(see also version_short()
.)
但是,有一些方法可以解决它。
假设您正在使用例如clap = "2.33"
。然后类似于您已经在做的事情,您可以 override/replace help
和 version
args,并以这种方式“删除”短版本。 (为简洁起见,我只包含 help
的示例。)
如果您愿意,您当然可以将其保留在 cli.yaml
中,但我会将其添加到 main.rs
。简而言之,您想添加一个新的 "help"
arg 并且只给它一个 long
版本。包含 help("Prints help information")
很重要,因为这会替换现有的 help
arg,所以如果不包含 --help
.
的默认帮助消息
过度 "help"
的缺点是您需要自己处理 print_help()
。
use clap::{load_yaml, App, Arg};
fn main() {
let y = load_yaml!("cli.yaml");
let mut app = App::from_yaml(y)
.arg(
Arg::with_name("help")
.long("help")
.help("Prints help information"),
);
let m = app.clone().get_matches();
if m.is_present("help") {
app.print_help().unwrap();
// std::process::exit(0);
// or just
return;
}
}
但是,如果您使用 clap = "3.0.0-beta.2"
then that simplifies things, with the introduction of mut_arg()
。因为这允许我们改变 the 参数。因此,我们不再需要自己调用print_help()
。
use clap::{load_yaml, App, Arg};
fn main() {
let y = load_yaml!("cli.yaml");
let m = App::from(y)
.mut_arg("help", |h| {
Arg::new("help")
.long("help")
.about("Prints help information")
})
.get_matches();
}
注意App::from_yaml()
现在是App::from()
,而Arg::with_name()
变成了Arg::new()
,help()
现在是about()
.
我想包含 --help
和 --version
多头选项,而不包含 -h
和 -V
空头选项。这可能吗?
我正在使用 clap 和 yaml。我能想到的最接近的方法是使用隐藏的(未使用的)参数来掩盖短选项。
# main.rs
use clap::{load_yaml, App};
fn main() {
let y = load_yaml!("cli.yaml");
let m = App::from_yaml(y).get_matches();
println!("_help {}", m.is_present("_help"));
println!("_version {}", m.is_present("_version"));
}
# Cargo.toml
[package]
name = "app"
version = "0.0.1"
edition = "2018"
[dependencies]
clap = {version = "~2.33.0", features = ["yaml"]}
# cli.yaml
name: app
version: 0.0.1
args:
- opt: { short: "o", long: "opt" }
- _help: { short: "h", hidden: true }
- _version: { short: "V", hidden: true }
$ cargo -q run -- --help
app 0.0.1
USAGE:
app [FLAGS]
FLAGS:
--help Prints help information
-o, --opt
--version Prints version information
$ cargo -q run -- -h
_help true
_version false
$ cargo -q run -- -o
_help false
_version false
$ cargo -q run -- -V
_help false
_version true
$ cargo -q run -- -x
error: Found argument '-x' which wasn't expected, or isn't valid in this context
USAGE:
app [FLAGS]
For more information try --help
感觉这不是一个非常干净的方法。有another/better方式吗?
Clap 更倾向于创建 args 解析器。因此,获取和删除现有参数的功能并不多。
如果您只是想将 "-h"
重命名为例如"-?"
,那么你可以用 help_short("-?")
(see also version_short()
.)
但是,有一些方法可以解决它。
假设您正在使用例如clap = "2.33"
。然后类似于您已经在做的事情,您可以 override/replace help
和 version
args,并以这种方式“删除”短版本。 (为简洁起见,我只包含 help
的示例。)
如果您愿意,您当然可以将其保留在 cli.yaml
中,但我会将其添加到 main.rs
。简而言之,您想添加一个新的 "help"
arg 并且只给它一个 long
版本。包含 help("Prints help information")
很重要,因为这会替换现有的 help
arg,所以如果不包含 --help
.
过度 "help"
的缺点是您需要自己处理 print_help()
。
use clap::{load_yaml, App, Arg};
fn main() {
let y = load_yaml!("cli.yaml");
let mut app = App::from_yaml(y)
.arg(
Arg::with_name("help")
.long("help")
.help("Prints help information"),
);
let m = app.clone().get_matches();
if m.is_present("help") {
app.print_help().unwrap();
// std::process::exit(0);
// or just
return;
}
}
但是,如果您使用 clap = "3.0.0-beta.2"
then that simplifies things, with the introduction of mut_arg()
。因为这允许我们改变 the 参数。因此,我们不再需要自己调用print_help()
。
use clap::{load_yaml, App, Arg};
fn main() {
let y = load_yaml!("cli.yaml");
let m = App::from(y)
.mut_arg("help", |h| {
Arg::new("help")
.long("help")
.about("Prints help information")
})
.get_matches();
}
注意App::from_yaml()
现在是App::from()
,而Arg::with_name()
变成了Arg::new()
,help()
现在是about()
.