rust中处理脚手架的工具有structopt 和clap
这里我们选择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)]:这行代码派生了Debug和Parser特性。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结构体派生Debug和Parser特性。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,输出结果如下:
总结
本文主要展示了如何在 rust 中使用 clap 库来定义一个支持子命令的命令行工具。通过 #[derive(Parser)] 宏和结构体、枚举结合,可以轻松定义复杂的命令行参数解析逻辑,同时自动生成帮助信息和版本信息。最终实现运行相关命令和参数,然后将输入的内容打印到控制台。
Repo: github.com/valcosmos/r…