[英]Clap subcommands over multiple rs files
我想构建一个更复杂的 CLI 工具。 就这个问题而言,假设我想构建自己的 AWS Cli 工具实施。
我想拆分不同服务(如 EC2、S3、sns 等)中的逻辑并能够在子命令上执行。
$ aws ec2 describe-instances
$ aws ec2 start-instances --instance-ids i-1348636c
$ aws s3 <Command> [<Arg> ...]
为了正确拆分业务逻辑,我想将子命令分布在多个文件中。
.
├── Cargo.lock
├── Cargo.toml
└── src
├── main.rs
├── S3.rs
├── Ec2.rs
└── etc.rs
我希望每个服务(S3、EC2 等)都能控制自己的命令和 arguments,这意味着子命令的结构需要分发到每个服务的 rs 文件(S3.rs、Ec2. rs等)。
为 rust/clap 中的 args 创建结构的最惯用方法是什么? 我更喜欢尽可能多地使用#[derive]
宏,因为看起来 clap 正在推荐这个。
对于每个级别的命令,您需要一个列出所有子命令的枚举,例如:
// main.rs
mod ec2;
mod s3;
#[derive(Parser)]
enum Cli {
S3(s3::Command),
EC2(ec2::Command),
}
然后,每个命令模块都可以有一个单独的结构,用于定义更多选项或子命令。
// ec2.rs
#[derive(Parser)]
pub(crate) struct Command {
#[clap(long)]
vpc: String,
#[clap(subcommand)]
subcommand: Subcommand
}
#[derive(Parser)]
enum Subcommand {
Instance(instance::Command),
FooBar(…)
}
您可以在 wasmer中找到此策略的真实示例。
main.rs
是 rust 程序中的默认可执行文件。 如果你想分发一个库,你通常会在bin
文件夹中有不同的可执行文件。
我建议将服务文件ec2.rs
和s3.rs
移动到src/bin
文件夹,使它们成为可执行文件。 您现在可以使用命令cargo run --bin s3
从命令行/终端直接运行这些文件。
src/bin/ec2.rs
src/bin/s3.rs
此外,对于子命令,您需要在Enum
中指定子命令并将这些命令提供给 clap 宏#[clap(subcommand)]
文件src/bin/ec2.rs
Struct Cli {
#[clap(subcommand)]
command: Command,
}
enum Command {
StartInstance { arg1: String, arg2: String }
DescribeInstance { arg1: String }
}
文件src/bin/ec2.rs
let args = Cli.parse();
let command = args.command;
// match on the command and extract args for further processing.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.