CLI 工具开发
问题
如何用 Rust 构建 CLI 工具?有哪些优势?
答案
Rust 构建的 CLI 工具启动快、无运行时依赖、单二进制分发。许多现代 CLI 工具都用 Rust 重写:ripgrep、fd、bat、zoxide、delta 等。
clap 构建完整 CLI
src/main.rs
use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "mytool", version, about = "一个示例 CLI 工具")]
struct Cli {
/// 启用详细输出
#[arg(short, long)]
verbose: bool,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
/// 初始化项目
Init {
/// 项目目录
#[arg(default_value = ".")]
path: PathBuf,
},
/// 构建项目
Build {
/// Release 模式
#[arg(long)]
release: bool,
},
}
fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::Init { path } => {
println!("初始化项目: {}", path.display());
}
Commands::Build { release } => {
let mode = if release { "release" } else { "debug" };
println!("构建模式: {}", mode);
}
}
Ok(())
}
常用 CLI 开发 crate
| crate | 用途 |
|---|---|
clap | 参数解析(derive 宏) |
indicatif | 进度条 |
dialoguer | 交互式提示 |
colored / console | 彩色输出 |
anyhow | 错误处理 |
tokio | 异步 IO |
分发策略
Cargo.toml
[profile.release]
opt-level = "z" # 体积优化
lto = true
strip = true
# 交叉编译
cargo install cross
cross build --release --target x86_64-unknown-linux-musl
# 产出静态链接的单二进制,可在任意 Linux 上运行
常见面试问题
Q1: Rust CLI 相比 Go CLI 有什么优势和劣势?
答案:
| 维度 | Rust | Go |
|---|---|---|
| 启动速度 | 更快(无 runtime) | 很快 |
| 二进制体积 | 更小(strip 后 1-5MB) | 较大(~10MB) |
| 编译速度 | 慢 | 快 |
| 交叉编译 | 需要 cross | 内置支持 |
| 生态 | clap 很强 | cobra 很强 |