如何让clap在特定子命令后忽略后续标志位?
解决clap捕获子命令后后续标志位的问题
你可以通过给Run子命令的args字段添加trailing_var_arg(true)属性,让clap在识别到executable之后,将所有后续内容(包括带--的参数)都捕获为目标程序的参数,无需用户手动输入--分隔符。
修改后的代码如下:
use clap::{Parser, Subcommand}; use std::ffi::OsString; #[derive(Debug, Parser)] struct Cli { #[command(subcommand)] pub command: Commands, } #[derive(Debug, Subcommand)] enum Commands { Run { executable: OsString, #[arg(trailing_var_arg = true)] args: Vec<OsString>, }, }
这样当用户执行foo run bar --baz时,clap会正确将--baz归入args数组,解析结果完全符合你的预期:
Cli { command: Run { executable: "bar", args: [ "--baz", ], }, }
原理是trailing_var_arg(true)告诉clap,这个参数要捕获所有剩余的命令行参数,不管它们是否以--开头,这样就跳过了clap对后续标志位的解析,直接把内容传递给目标程序的参数列表。
内容的提问来源于stack exchange,提问作者yottalogical
相关产品推荐
相关产品推荐

