Skip to content

常用库推荐

Rust 拥有丰富的生态系统,这里推荐一些在不同领域中最常用和最优秀的库。

基础工具库

错误处理

toml
[dependencies]
# 简化错误处理
anyhow = "1.0"          # 简单的错误处理
thiserror = "1.0"       # 自定义错误类型
eyre = "0.6"           # anyhow 的替代品
rust
// anyhow 示例
use anyhow::{Context, Result};

fn read_config() -> Result<String> {
    std::fs::read_to_string("config.toml")
        .context("Failed to read config file")?;
    Ok("config content".to_string())
}

// thiserror 示例
use thiserror::Error;

#[derive(Error, Debug)]
pub enum MyError {
    #[error("IO error: {0}")]
    Io(#[from] std::io::Error),
    #[error("Parse error: {message}")]
    Parse { message: String },
}

序列化

toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"      # JSON 支持
serde_yaml = "0.9"      # YAML 支持
toml = "0.8"           # TOML 支持
bincode = "1.3"        # 二进制序列化
rust
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct Config {
    name: String,
    port: u16,
    features: Vec<String>,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = Config {
        name: "MyApp".to_string(),
        port: 8080,
        features: vec!["auth".to_string(), "logging".to_string()],
    };

    // JSON
    let json = serde_json::to_string(&config)?;
    println!("JSON: {}", json);

    // YAML
    let yaml = serde_yaml::to_string(&config)?;
    println!("YAML: {}", yaml);

    Ok(())
}

日期时间

toml
[dependencies]
chrono = { version = "0.4", features = ["serde"] }
time = "0.3"           # 更现代的时间库
rust
use chrono::{DateTime, Utc, Local, Duration};

fn main() {
    let now = Utc::now();
    let local = Local::now();
    
    println!("UTC: {}", now);
    println!("Local: {}", local);
    
    let tomorrow = now + Duration::days(1);
    println!("Tomorrow: {}", tomorrow);
}

异步编程

异步运行时

toml
[dependencies]
tokio = { version = "1.0", features = ["full"] }
async-std = "1.12"     # 替代运行时
smol = "1.3"          # 轻量级运行时

异步工具

toml
[dependencies]
futures = "0.3"        # Future 工具
tokio-stream = "0.1"   # 异步流
async-trait = "0.1"    # 异步 trait
rust
use tokio::time::{sleep, Duration};
use futures::stream::{self, StreamExt};

#[tokio::main]
async fn main() {
    // 并发执行
    let tasks = (0..5).map(|i| {
        tokio::spawn(async move {
            sleep(Duration::from_millis(100 * i)).await;
            format!("Task {} completed", i)
        })
    });

    let results = futures::future::join_all(tasks).await;
    for result in results {
        println!("{}", result.unwrap());
    }

    // 流处理
    let stream = stream::iter(0..10)
        .map(|x| x * 2)
        .filter(|&x| x > 5);

    stream.for_each(|x| async move {
        println!("Processed: {}", x);
    }).await;
}

网络编程

HTTP 客户端

toml
[dependencies]
reqwest = { version = "0.11", features = ["json"] }
hyper = { version = "0.14", features = ["full"] }
rust
use reqwest;
use serde::Deserialize;

#[derive(Deserialize)]
struct Post {
    id: u32,
    title: String,
    body: String,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::Client::new();
    
    let post: Post = client
        .get("https://jsonplaceholder.typicode.com/posts/1")
        .send()
        .await?
        .json()
        .await?;

    println!("Title: {}", post.title);
    Ok(())
}

Web 框架

toml
[dependencies]
axum = "0.7"           # 现代 web 框架
warp = "0.3"           # 函数式 web 框架
actix-web = "4.0"      # 高性能 web 框架
rocket = "0.5"         # 易用的 web 框架
rust
// Axum 示例
use axum::{
    routing::{get, post},
    http::StatusCode,
    Json, Router,
};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct User {
    id: u64,
    username: String,
}

async fn get_user() -> Json<User> {
    Json(User {
        id: 1,
        username: "alice".to_string(),
    })
}

async fn create_user(Json(payload): Json<User>) -> StatusCode {
    println!("Creating user: {}", payload.username);
    StatusCode::CREATED
}

#[tokio::main]
async fn main() {
    let app = Router::new()
        .route("/users", get(get_user))
        .route("/users", post(create_user));

    println!("Server running on http://localhost:3000");
    axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
        .serve(app.into_make_service())
        .await
        .unwrap();
}

数据库

SQL 数据库

toml
[dependencies]
sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres", "chrono", "uuid"] }
diesel = { version = "2.1", features = ["postgres", "chrono"] }
sea-orm = { version = "0.12", features = ["sqlx-postgres", "runtime-tokio-rustls", "macros"] }
rust
// SQLx 示例
use sqlx::{PgPool, Row};

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    let pool = PgPool::connect("postgresql://user:password@localhost/database").await?;

    let row = sqlx::query("SELECT id, name FROM users WHERE id = $1")
        .bind(1i64)
        .fetch_one(&pool)
        .await?;

    let id: i64 = row.get("id");
    let name: String = row.get("name");

    println!("User: {} (ID: {})", name, id);
    Ok(())
}

NoSQL 数据库

toml
[dependencies]
redis = { version = "0.23", features = ["tokio-comp"] }
mongodb = "2.7"

命令行工具

参数解析

toml
[dependencies]
clap = { version = "4.0", features = ["derive"] }
structopt = "0.3"      # 基于 clap 的宏
rust
use clap::{Parser, Subcommand};

#[derive(Parser)]
#[command(name = "myapp")]
#[command(about = "A fictional versioning CLI")]
struct Cli {
    #[command(subcommand)]
    command: Option<Commands>,
}

#[derive(Subcommand)]
enum Commands {
    /// Add a new item
    Add {
        /// Name of the item
        name: String,
        /// Optional description
        #[arg(short, long)]
        description: Option<String>,
    },
    /// List all items
    List,
}

fn main() {
    let cli = Cli::parse();

    match &cli.command {
        Some(Commands::Add { name, description }) => {
            println!("Adding item: {}", name);
            if let Some(desc) = description {
                println!("Description: {}", desc);
            }
        }
        Some(Commands::List) => {
            println!("Listing all items");
        }
        None => {
            println!("No command specified");
        }
    }
}

终端 UI

toml
[dependencies]
crossterm = "0.27"     # 跨平台终端操作
ratatui = "0.24"       # 终端 UI 框架
console = "0.15"       # 终端工具
indicatif = "0.17"     # 进度条
rust
use indicatif::{ProgressBar, ProgressStyle};
use std::time::Duration;

fn main() {
    let pb = ProgressBar::new(100);
    pb.set_style(
        ProgressStyle::default_bar()
            .template("{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos:>7}/{len:7} {msg}")
            .unwrap()
            .progress_chars("#>-"),
    );

    for i in 0..100 {
        pb.set_position(i);
        pb.set_message(format!("Processing item {}", i));
        std::thread::sleep(Duration::from_millis(50));
    }

    pb.finish_with_message("Done!");
}

数据处理

CSV 处理

toml
[dependencies]
csv = "1.3"
rust
use csv::Reader;
use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct Record {
    name: String,
    age: u32,
    city: String,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let data = "name,age,city\nAlice,30,New York\nBob,25,London";
    let mut reader = Reader::from_reader(data.as_bytes());

    for result in reader.deserialize() {
        let record: Record = result?;
        println!("{:?}", record);
    }

    Ok(())
}

正则表达式

toml
[dependencies]
regex = "1.10"
rust
use regex::Regex;

fn main() {
    let re = Regex::new(r"(\d{4})-(\d{2})-(\d{2})").unwrap();
    let text = "Today is 2023-12-25 and tomorrow is 2023-12-26";

    for cap in re.captures_iter(text) {
        println!("Date: {}, Year: {}, Month: {}, Day: {}", 
                 &cap[0], &cap[1], &cap[2], &cap[3]);
    }
}

图像和多媒体

图像处理

toml
[dependencies]
image = "0.24"
rust
use image::{ImageBuffer, Rgb};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建一个简单的渐变图像
    let img = ImageBuffer::from_fn(256, 256, |x, y| {
        Rgb([x as u8, y as u8, (x + y) as u8])
    });

    img.save("gradient.png")?;
    println!("Image saved as gradient.png");

    // 加载和处理图像
    let img = image::open("gradient.png")?;
    let resized = img.resize(128, 128, image::imageops::FilterType::Lanczos3);
    resized.save("gradient_small.png")?;

    Ok(())
}

加密和安全

密码学

toml
[dependencies]
ring = "0.17"          # 密码学原语
rustls = "0.21"        # TLS 实现
argon2 = "0.5"         # 密码哈希
rust
use ring::{digest, rand};
use ring::rand::SecureRandom;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 生成随机数
    let rng = rand::SystemRandom::new();
    let mut key = [0u8; 32];
    rng.fill(&mut key)?;
    println!("Random key: {:?}", key);

    // 计算哈希
    let data = b"Hello, world!";
    let hash = digest::digest(&digest::SHA256, data);
    println!("SHA256: {:?}", hash.as_ref());

    Ok(())
}

测试和基准

测试工具

toml
[dev-dependencies]
proptest = "1.0"       # 属性测试
mockall = "0.11"       # 模拟对象
wiremock = "0.5"       # HTTP 模拟

基准测试

toml
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
rust
// benches/my_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};

fn fibonacci(n: u64) -> u64 {
    match n {
        0 => 1,
        1 => 1,
        n => fibonacci(n-1) + fibonacci(n-2),
    }
}

fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);

配置管理

配置库

toml
[dependencies]
config = "0.13"        # 配置管理
figment = "0.10"       # 分层配置
rust
use config::{Config, ConfigError, File};
use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct AppConfig {
    database_url: String,
    port: u16,
    debug: bool,
}

fn load_config() -> Result<AppConfig, ConfigError> {
    let settings = Config::builder()
        .add_source(File::with_name("config/default"))
        .add_source(File::with_name("config/local").required(false))
        .build()?;

    settings.try_deserialize()
}

并发和并行

并发工具

toml
[dependencies]
rayon = "1.8"          # 数据并行
crossbeam = "0.8"      # 并发工具
parking_lot = "0.12"   # 高性能锁
rust
use rayon::prelude::*;

fn main() {
    let numbers: Vec<i32> = (0..1_000_000).collect();
    
    // 并行计算
    let sum: i32 = numbers.par_iter().sum();
    println!("Sum: {}", sum);

    // 并行映射
    let squares: Vec<i32> = numbers
        .par_iter()
        .map(|&x| x * x)
        .collect();
    
    println!("First 10 squares: {:?}", &squares[..10]);
}

系统编程

系统接口

toml
[dependencies]
libc = "0.2"           # C 库绑定
nix = "0.27"           # Unix 系统调用
winapi = "0.3"         # Windows API (仅 Windows)

文件系统

toml
[dependencies]
walkdir = "2.4"        # 目录遍历
notify = "6.1"         # 文件系统监控
tempfile = "3.8"       # 临时文件
rust
use walkdir::WalkDir;

fn main() {
    for entry in WalkDir::new(".").into_iter().filter_map(|e| e.ok()) {
        if entry.file_type().is_file() {
            println!("{}", entry.path().display());
        }
    }
}

开发工具

日志

toml
[dependencies]
log = "0.4"            # 日志接口
env_logger = "0.10"    # 简单日志实现
tracing = "0.1"        # 结构化日志
tracing-subscriber = "0.3"
rust
use tracing::{info, warn, error, instrument};

#[instrument]
async fn process_data(id: u32) -> Result<String, &'static str> {
    info!("Processing data for ID: {}", id);
    
    if id == 0 {
        error!("Invalid ID: 0");
        return Err("Invalid ID");
    }
    
    warn!("This is a warning for ID: {}", id);
    Ok(format!("Processed data for ID: {}", id))
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();
    
    let result = process_data(42).await;
    match result {
        Ok(data) => info!("Success: {}", data),
        Err(e) => error!("Error: {}", e),
    }
}

选择建议

按用途选择

Web 开发:axum + sqlx + serde + tokio CLI 工具:clap + anyhow + serde 系统工具:tokio + crossbeam + libc 数据处理:rayon + csv + serde 网络服务:tokio + reqwest + tracing

版本管理

  • 优先选择活跃维护的库
  • 查看 GitHub stars 和最近更新时间
  • 阅读文档和社区反馈
  • 考虑库的依赖数量和编译时间

性能考虑

  • 对于高性能需求,选择零成本抽象的库
  • 考虑编译时间 vs 运行时性能的权衡
  • 使用 cargo tree 检查依赖树
  • 定期更新依赖以获得性能改进

这些库构成了 Rust 生态系统的核心,掌握它们将大大提高您的开发效率!