Включить длинные параметры без коротких параметров справки и версии

Я хотел бы включить длинные варианты --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

Это не похоже на очень чистый подход. Есть ли другой/лучший способ?

Просто чтобы было ясно, вы хотите, чтобы -h привело к "Found argument '-h' which wasn't expected, ...", верно?

vallentin 12.12.2020 01:35

@vallentin, да, именно так.

snapshoe 12.12.2020 01:43
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
2
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Clap больше предназначен для создания парсера аргументов. Таким образом, на самом деле не так много функций для получения и удаления существующих аргументов.

Если вы просто хотите переименовать "-h", например. "-?", то вы можете сделать это с помощью help_short("-?") (см. также version_short().)

Однако есть способы обойти это.


Предполагая, что вы используете, например. clap = "2.33". Затем, аналогично тому, что вы уже делаете, вы можете переопределить/заменить аргументы help и version и таким образом «удалить» короткие версии. (Для краткости я приведу примеры только для help.)

Вы, конечно, можете оставить его в cli.yaml, если хотите, но я добавлю его в main.rs. Короче говоря, вы хотите добавить новый "help" аргумент и дать ему только long версию. Важно, чтобы вы включили help("Prints help information"), поскольку он заменяет существующий аргумент help, поэтому, если вы этого не сделаете, у него не будет справочного сообщения по умолчанию для --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" , это упрощает ситуацию с введением 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() теперь App::from(), а Arg::with_name() стало Arg::new(), а help() теперь about().

Идеальный! Информация о текущих стабильных и новых версиях была очень полезной. Точная информация, которую я искал. Спасибо.

snapshoe 14.12.2020 16:05

Похоже, этот ответ сейчас полностью устарел; У clap было две основные версии с момента его публикации, и ни один из задействованных API-интерфейсов до сих пор не существует. У кого-нибудь есть информация о том, как это сделать в v4?

Tom Hunt 27.01.2023 20:14

Другие вопросы по теме