在没有提供命令的情况下,Clap 有没有直接显示帮助的方法?

问题描述 投票:0回答:3

我正在使用 Clap crate 来解析命令行参数。我定义了一个子命令

ls
来列出文件。 Clap 还定义了一个
help
子命令,用于显示有关应用程序及其使用情况的信息。

如果未提供命令,则根本不会显示任何内容,但我希望应用程序在这种情况下显示帮助。

我已经尝试过这段代码,看起来很简单,但它不起作用:

extern crate clap;

use clap::{App, SubCommand};

fn main() {
    let mut app = App::new("myapp")
        .version("0.0.1")
        .about("My first CLI APP")
        .subcommand(SubCommand::with_name("ls").about("List anything"));
    let matches = app.get_matches();

    if let Some(cmd) = matches.subcommand_name() {
        match cmd {
            "ls" => println!("List something here"),
            _ => eprintln!("unknown command"),
        }
    } else {
        app.print_long_help();
    }
}

我收到一个错误,移动后使用了

app

error[E0382]: use of moved value: `app`
  --> src/main.rs:18:9
   |
10 |     let matches = app.get_matches();
   |                   --- value moved here
...
18 |         app.print_long_help();
   |         ^^^ value used here after move
   |
   = note: move occurs because `app` has type `clap::App<'_, '_>`, which does not implement the `Copy` trait

阅读 Clap 的文档,我发现

clap::ArgMatches
中返回的
get_matches()
有一个方法
usage
可以返回使用部分的字符串,但不幸的是,只有这部分,没有其他内容。

rust command-line-interface clap
3个回答
45
投票

使用

clap::AppSettings::ArgRequiredElseHelp

App::new("myprog")
    .setting(AppSettings::ArgRequiredElseHelp)

另请参阅:


4
投票

如果您使用 derive 而不是构建器 API,您可以设置 shepmaster 提到的标志,如下所示:

#[command(arg_required_else_help = true)]
pub struct Cli {

    #[clap(short)]
    pub init: bool,

另请参阅:https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html#configuring-the-parser


4
投票

您还可以将

Command::arg_required_else_help
用作命令本身的
bool

Command::new("rule").arg_required_else_help(true)
© www.soinside.com 2019 - 2024. All rights reserved.