Rust 写脚手架,Clap你应该知道的二三事( 二 )

其中-F表示,我们只需要clap中的derive特性 。

Rust 写脚手架,Clap你应该知道的二三事

文章插图
图片
上述流程中,我们使用的clap的版本是最新版,有些和大家用过的语法有区别的话,需要大家甄别 。
这里多说一嘴,如果对前端开发熟悉的同学是不是感觉到上述流程很熟悉 。当我们创建一个前端项目时,是不是会遇到下面的步骤 。
npm init yarn add xx项目实现和前端开发类似,当我们把包下载到本地后,我们就需要在对应的入口文件中引入并执行 。在前端开发中我们一般挑选的是项目根目录下的index.js 。而对于Rust项目来讲,它的入口文件是src/mAIn.rs 。(作为二进制项目(Binary Projects)而言)
use clap::Parser;#[derive(Parser)]#[command(version, about)]struct Cli {name: String}fn main() {let cli = Cli::parse();println!("Hello, {}!", cli.name);}我们来简单解释一下上面的代码 。
在前端开发中我们一般使用import/require进行第三方库的引入 , 而在Rust中我们使用use来导入第三方库clap中的Parser trait 。也就是说,通过use xx我们就可以使用clap中的特定功能 。也就是把对应的功能引入到该作用域内 。
定义了一个结构体 , 它使用 clap::Parser 的 derive 宏和command宏 , 并且只接受一个参数,即 name 。
#[derive(Parser)]/#[command(version, about)]不是Rust内置的宏,它们是由clap库自定义的过程宏(procedural macros) 。
Rust有两种类型的宏:
  1. 声明式宏(Declarative Macros):
这些是Rust内置的,使用macro_rules定义,例如vec!、println!等 。
它们主要用于元编程(metaprogramming),在编译期执行代码生成 。
  1. 过程宏(Procedural Macros):
  • 这些是由外部crate定义的,在编译期间像函数一样被调用 。
  • 它们可以用来实现自定义的代码生成、lint检查、trait派生,解析、操作和生成 AST等操作 。
#[derive(Parser)]它使用 derive 属性来自动为 Cli 结构体实现 Parser trait 。这意味着 Cli 结构体将获得解析命令行参数的功能,而无需手动实现 Parser trait 。
Rust 写脚手架,Clap你应该知道的二三事

文章插图
图片
#[command(version, about)]用于配置命令行应用程序的元数据 。
  • version: 设置应用程序的版本信息 。
  • about: 设置应用程序的简短描述 。这里的信息就是我们在Cargo.toml中配置的description的信息 。
最后,我们可以通过cargo run -- --help来查看对应的信息 。
Rust 写脚手架,Clap你应该知道的二三事

文章插图
图片
总的来说,这段代码使用 clap 库定义了一个命令行应用程序,它接受一个名为 name 的字符串参数 。当运行这个应用程序时,它会打印出 "Hello, {name}" 。#[derive(Parser)] 和 #[command(...)] 这两个属性分别用于自动实现 Parser trait 和配置应用程序的元数据 。
当我们加载程序并使用 Cli::parse() 时,它将从 std::env::args 中获取参数(这个概念我们之前在环境变量:熟悉的陌生人有过介绍) 。
  • 如果你尝试运行 cargo run front789,它应该会打印出 Hello, front789!
  • 但如果尝试不添加任何额外值运行它,它将打印出帮助菜单 。Clap 在默认特性中包含了一个帮助功能,当输入的命令无效时会自动显示帮助菜单 。
当然 , 如果想让我们的程序更加健壮 , 我们可以给name设定一个默认值,这样在没有提供参数的情况下,也能合理运行 。
#[derive(Parser,Debug)]#[command(version, about)]struct Cli {#[arg(default_value = https://www.isolves.com/it/cxkf/yy/Rust/2024-03-11/"front789")]name: String}现在,尝试仅使用 cargo run 而不添加其他任何东西,它应该会打印出 Hello, front789! 。
Rust 写脚手架,Clap你应该知道的二三事

文章插图
图片
当然,我们也可以像在f_cli中一样为参数添加更多的配置,来增强我们的Cli 。
Rust 写脚手架,Clap你应该知道的二三事


推荐阅读