rust创建脚手架(clap)

975 阅读3分钟

rust中处理脚手架的工具有structoptclap

这里我们选择clap

需求介绍

实现一个简单的cli,实现运行,输入参数,然后打印输入的参数。

安装clap

cargo add clap --features derive

--features derive 选项在 Rust 中启用 clap 库的 derive 特性。 Cargo Features 是 Rust 的包管理工具 Cargo 提供的一种机制,允许库的作者定义可选的功能模块。通过这种机制,用户可以在依赖库时启用或禁用某些功能,从而定制依赖的行为并减少不必要的依赖和编译时间。

创建Opts结构体

use clap::Parser;

#[derive(Debug, Parser)]
#[command(name="rcli", version, author, about, long_about=None)]
struct Opts {
    #[command(subcommand)]
    cmd: SubCommand,
}
  • #[derive(Debug, Parser)] :这行代码派生了 DebugParser 特性。Debug 使得结构体可以使用 {:?} 进行格式化输出,Parser 使得结构体可以用作命令行解析器。

  • #[command(name="rcli", version, author, about, long_about=None)] :这个属性为命令行工具提供了一些元数据:

    • name="rcli" :设置命令行工具的名称为 rcli
    • version:自动从 Cargo.toml 中获取版本号。
    • author:自动从 Cargo.toml 中获取作者信息。
    • about:简短描述工具的用途。
    • long_about=None:提供更详细的描述,这里设置为 None,表示没有额外的详细描述。
  • cmd: SubCommand:这个字段表示命令行工具的子命令。

创建子命令

  • 创建SubCommand枚举
#[derive(Debug, Parser)]
enum SubCommand {
    #[command(name = "csv", about = "Convert CSV to other formats")]
    Csv(CsvOpts),
}
  • name = "csv":指定子命令的名称为 csv。在命令行中输入 csv 就会触发这个子命令。
  • about = "Convert CSV to other formats":提供一个简短的描述,说明这个子命令的用途。

定义选项参数

#[derive(Debug, Parser)]
struct CsvOpts {
    #[arg(short, long)]
    input: String,

    #[arg(short, long, default_value = "output.json")]
    output: String,

    #[arg(short, long, default_value_t = ',')]
    delimiter: char,

    #[arg(long, default_value_t = true)]
    header: bool,
}
  • #[derive(Debug, Parser)] :为 CsvOpts 结构体派生 DebugParser 特性。
  • input: String:一个必需的参数,用于指定输入文件,带有短选项 -i 和长选项 --input
  • output: String:一个可选参数,用于指定输出文件,带有短选项 -o 和长选项 --output,默认值为 output.json
  • delimiter: char:一个可选参数,用于指定分隔符,带有短选项 -d 和长选项 --delimiter,默认值为逗号 ,
  • header: bool:一个可选参数,用于指定是否包含表头,带有长选项 --header,默认值为 true

运行

main函数中的代码如下:

fn main() {
    let opts = Opts::parse();
    print!("{:?}", opts)
}

在控制台运行cargo run -- csv -i data.csv -o result.json -d ';' --header,输出结果如下:

image.png

总结

本文主要展示了如何在 rust 中使用 clap 库来定义一个支持子命令的命令行工具。通过 #[derive(Parser)] 宏和结构体、枚举结合,可以轻松定义复杂的命令行参数解析逻辑,同时自动生成帮助信息和版本信息。最终实现运行相关命令和参数,然后将输入的内容打印到控制台。

Repo: github.com/valcosmos/r…