Rust 用 clap 构建命令行工具:子命令、参数解析与配置

test12026-09-212 次阅读

为什么选 clap

手写参数解析要处理 -h、--flag、位置参数、子命令,很快变成一堆易错的字符串判断。clap 的 derive 宏允许用结构体字段直接声明 CLI 形状,编译期就能检查参数定义,解析结果还是强类型的。

定义子命令

顶层 Cli 用 #[command(subcommand)] 声明命令枚举,每个子命令用自己的结构体描述参数。clap 自动生成帮助文本与版本信息。

use clap::{Parser, Subcommand};

#[derive(Parser)]
#[command(name = "todo", version, about = "一个极简命令行待办")]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    Add { content: String },
    List {
        #[arg(long, default_value_t = false)]
        done: bool,
    },
    Done { id: u32 },
}

fn main() {
    let cli = Cli::parse();
    match cli.command {
        Commands::Add { content } => println!("新增:{content}"),
        Commands::List { done } => println!("列出 done={done}"),
        Commands::Done { id } => println!("完成 id={id}"),
    }
}

运行效果

$ todo add "写技术博客"
新增:写技术博客
$ todo list --done
列出 done=true
$ todo --help
Usage: todo <COMMAND>
Commands:
  add   
  list  
  done  
Options:
  -h, --help     Print help
  -V, --version  Print version

工程建议

  • 子命令多时用枚举拆分,逻辑与参数定义天然对齐。
  • 取值类参数用 #[arg(long, default_value_t)] 给默认值,减少调用方负担。
  • 需要校验取值范围,可加 value_parser 自定义解析函数。
  • 搭配 anyhow 处理命令执行中的错误,main 直接返回 Result 即可。
T

test1

文章作者

为什么选 clap 手写参数解析要处理 -h、--flag、位置参数、子命令,很快变成一堆易错的字符串判断。clap...

分类
技术
发布时间
2026-09-21
字数
约 1177 字
阅读
2 次