跳到主要内容

Cargo 包管理器

Cargo 是 Rust 的构建系统和包管理器。它处理依赖管理、编译、测试、文档生成等任务,是 Rust 开发的核心工具。

项目管理

创建新项目

# 创建二进制项目
cargo new my_project
cargo new my_project --bin # 显式指定二进制项目

# 创建库项目
cargo new my_library --lib

# 在现有目录初始化项目
cargo init
cargo init --lib # 初始化为库项目

项目结构

my_project/
├── Cargo.toml # 项目配置文件
├── Cargo.lock # 依赖锁定文件
├── src/
│ ├── main.rs # 二进制项目入口
│ └── lib.rs # 库项目入口
├── tests/ # 集成测试
├── examples/ # 示例代码
├── benches/ # 性能测试
└── target/ # 编译输出目录

构建和运行

基本构建命令

# 编译项目(调试模式)
cargo build

# 编译项目(发布模式)
cargo build --release

# 编译并运行
cargo run

# 编译并运行(发布模式)
cargo run --release

# 只检查代码(不生成二进制文件)
cargo check

指定目标

# 运行特定的二进制文件
cargo run --bin my_binary

# 运行示例
cargo run --example my_example

# 为特定平台构建
cargo build --target x86_64-pc-windows-gnu

依赖管理

Cargo.toml 配置

[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
authors = ["Your Name <[email protected]>"]
description = "A sample Rust project"
license = "MIT"
repository = "https://github.com/username/my_project"

[dependencies]
serde = "1.0"
tokio = { version = "1.0", features = ["full"] }
reqwest = { version = "0.11", optional = true }

[dev-dependencies]
criterion = "0.5"

[build-dependencies]
cc = "1.0"

[features]
default = ["json"]
json = ["serde/derive"]
http = ["reqwest"]

添加依赖

# 添加依赖
cargo add serde

# 添加特定版本
cargo add [email protected]

# 添加开发依赖
cargo add --dev criterion

# 添加构建依赖
cargo add --build cc

# 添加可选依赖
cargo add --optional reqwest

更新依赖

# 更新所有依赖
cargo update

# 更新特定依赖
cargo update serde

# 查看过时的依赖
cargo outdated # 需要安装 cargo-outdated

测试

运行测试

# 运行所有测试
cargo test

# 运行特定测试
cargo test test_name

# 运行匹配模式的测试
cargo test integration

# 显示测试输出
cargo test -- --nocapture

# 并行运行测试
cargo test -- --test-threads=4

测试类型

# 只运行单元测试
cargo test --lib

# 只运行集成测试
cargo test --test integration_test

# 运行文档测试
cargo test --doc

# 运行性能测试
cargo bench

文档

生成文档

# 生成项目文档
cargo doc

# 生成并打开文档
cargo doc --open

# 包含私有项的文档
cargo doc --document-private-items

# 不包含依赖的文档
cargo doc --no-deps

文档测试

/// 这个函数将两个数字相加
///
/// # Examples
///
/// ```
/// use my_crate::add;
/// assert_eq!(add(2, 3), 5);
/// ```
pub fn add(a: i32, b: i32) -> i32 {
a + b
}

发布和分享

发布到 crates.io

# 登录 crates.io
cargo login

# 发布包
cargo publish

# 干运行(检查但不发布)
cargo publish --dry-run

# 撤回版本(72小时内)
cargo yank --vers 1.0.1

本地安装

# 从 crates.io 安装
cargo install ripgrep

# 从本地路径安装
cargo install --path .

# 从 Git 仓库安装
cargo install --git https://github.com/user/repo

# 卸载
cargo uninstall ripgrep

工作空间

创建工作空间

# Cargo.toml (根目录)
[workspace]
members = [
"crate1",
"crate2",
"tools/*",
]

[workspace.dependencies]
serde = "1.0"

工作空间命令

# 构建整个工作空间
cargo build

# 构建特定包
cargo build -p crate1

# 运行特定包
cargo run -p crate1

# 测试整个工作空间
cargo test

# 测试特定包
cargo test -p crate1

配置和环境

Cargo 配置文件

# ~/.cargo/config.toml 或 .cargo/config.toml

[build]
target = "x86_64-unknown-linux-gnu"
rustflags = ["-C", "target-cpu=native"]

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"

[registries.my-registry]
index = "https://my-intranet:8080/git/index"

[net]
retry = 2
git-fetch-with-cli = true

[profile.release]
lto = true
codegen-units = 1

环境变量

# 设置目标平台
export CARGO_BUILD_TARGET=x86_64-pc-windows-gnu

# 设置编译标志
export RUSTFLAGS="-C target-cpu=native"

# 设置 Cargo 主目录
export CARGO_HOME=~/.cargo

# 离线模式
export CARGO_NET_OFFLINE=true

性能优化

编译配置

[profile.dev]
opt-level = 0
debug = true
split-debuginfo = '...'
strip = "none"
debug-assertions = true
overflow-checks = true
lto = false
panic = 'unwind'
incremental = true
codegen-units = 256
rpath = false

[profile.release]
opt-level = 3
debug = false
strip = "debuginfo"
debug-assertions = false
overflow-checks = false
lto = true
panic = 'unwind'
incremental = false
codegen-units = 1
rpath = false

编译加速

# 使用 sccache 缓存编译结果
export RUSTC_WRAPPER=sccache

# 并行编译
export CARGO_BUILD_JOBS=8

# 增量编译
export CARGO_INCREMENTAL=1

常用子命令

代码质量

# 代码格式化
cargo fmt

# 代码检查
cargo clippy

# 安全审计
cargo audit # 需要安装 cargo-audit

# 许可证检查
cargo license # 需要安装 cargo-license

项目信息

# 查看项目信息
cargo metadata

# 查看依赖树
cargo tree

# 查看过时依赖
cargo outdated

# 查看重复依赖
cargo duplicate # 需要安装 cargo-duplicate

清理和维护

# 清理构建产物
cargo clean

# 修复 Cargo.lock
cargo generate-lockfile

# 验证项目
cargo verify-project

# 获取帮助
cargo help
cargo help build

自定义命令

安装有用的 Cargo 扩展

# 代码覆盖率
cargo install cargo-tarpaulin

# 安全审计
cargo install cargo-audit

# 许可证检查
cargo install cargo-license

# 依赖分析
cargo install cargo-tree

# 性能分析
cargo install cargo-profiler

# 交叉编译
cargo install cross

使用扩展

# 生成代码覆盖率报告
cargo tarpaulin --out Html

# 安全审计
cargo audit

# 使用 cross 进行交叉编译
cross build --target aarch64-unknown-linux-gnu

最佳实践

  1. 版本管理

    • 使用语义化版本
    • 及时更新 Cargo.lock
  2. 依赖管理

    • 最小化依赖
    • 使用特性标志控制可选功能
  3. 性能优化

    • 发布版本使用 --release
    • 配置适当的编译选项
  4. 代码质量

    • 定期运行 cargo clippy
    • 使用 cargo fmt 保持代码风格一致
  5. 安全性

    • 定期运行 cargo audit
    • 及时更新依赖

Cargo 是 Rust 生态系统的核心,掌握它的使用对于高效的 Rust 开发至关重要。