跳到主要内容

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 有什么优势和劣势?

答案

维度RustGo
启动速度更快(无 runtime)很快
二进制体积更小(strip 后 1-5MB)较大(~10MB)
编译速度
交叉编译需要 cross内置支持
生态clap 很强cobra 很强

相关链接