Я хотел бы включить длинные варианты --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
Это не похоже на очень чистый подход. Есть ли другой/лучший способ?
@vallentin, да, именно так.
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()
.
Идеальный! Информация о текущих стабильных и новых версиях была очень полезной. Точная информация, которую я искал. Спасибо.
Похоже, этот ответ сейчас полностью устарел; У clap было две основные версии с момента его публикации, и ни один из задействованных API-интерфейсов до сих пор не существует. У кого-нибудь есть информация о том, как это сделать в v4?
Просто чтобы было ясно, вы хотите, чтобы
-h
привело к"Found argument '-h' which wasn't expected, ..."
, верно?