1

我想包括没有和短选项的--help长选项。这可能吗?--version-h-V

我正在使用 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

这感觉不是一个非常干净的方法。还有其他/更好的方法吗?

4

1 回答 1

2

Clap 的设计更倾向于创建一个 args 解析器。因此,获取和删除现有参数的功能并不多。

如果您只是想重命名"-h"为 eg "-?",那么您可以使用help_short("-?")(另请参阅version_short()。)

但是,有一些方法可以解决它。


假设您正在使用 eg clap = "2.33"。然后与您已经在做的类似,您可以覆盖/替换helpversionargs,并以这种方式“删除”短版本。(为简洁起见,我将仅包括 的示例help。)

如果您愿意,当然可以保留它cli.yaml,但我会将其添加到main.rs. 简而言之,你想添加一个新的"help"arg 并且只给它一个long版本。重要的是你包括help("Prints help information"),因为这将替换现有的helparg,所以如果你不这样做,它不会有--help.

overring 的缺点"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 会简化事情,引入mut_arg(). 因为这允许我们改变论点。因此,我们不再需要调用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()is now App::from(),while Arg::with_name()has becomeArg::new()help()is now about()

于 2020-12-12T01:51:44.057 回答