Cargo 教程
以下是用中文详细讲解 Rust 的包管理器和构建工具 Cargo 的教程,涵盖其基本功能、使用方法和常见场景,适合初学者和有一定经验的 Rust 开发者。教程将简洁明了,逐步介绍 Cargo 的核心概念和操作,并提供实用示例。
1. Cargo 简介
Cargo 是 Rust 的官方构建工具和包管理器,类似于 Python 的 pip
或 Node.js 的 npm
。它用于:
- 创建和管理 Rust 项目。
- 管理依赖(crates,Rust 的包)。
- 编译、运行和测试代码。
- 发布和分享库。
Cargo 随 Rust 安装(通过 rustup
)自动包含,无需单独安装。
2. 验证 Cargo 安装
在终端运行以下命令,检查 Cargo 是否正确安装:
cargo --version
输出示例:
cargo 1.81.0 (2024-09-12)
如果未显示版本,确保 Rust 环境已正确配置(参考 Rust 环境搭建教程)。
3. 创建新项目
Cargo 提供命令快速创建标准化的 Rust 项目结构。
3.1 创建项目
cargo new my_project
cd my_project
这会生成以下目录结构:
my_project/
├── Cargo.toml
└── src/
└── main.rs
Cargo.toml
:项目的配置文件,包含元数据和依赖信息。src/main.rs
:默认的主程序文件,包含fn main()
函数。
示例 Cargo.toml
:
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
[dependencies]
示例 src/main.rs
:
fn main() {
println!("Hello, world!");
}
3.2 运行项目
在项目目录下运行:
cargo run
输出:
Compiling my_project v0.1.0 (/path/to/my_project)
Finished dev [unoptimized + debuginfo] target(s) in 0.5s
Running `target/debug/my_project`
Hello, world!
cargo run
自动编译并运行项目。- 编译后的可执行文件位于
target/debug/
。
3.3 构建项目
仅编译项目,不运行:
cargo build
- 生成的可执行文件在
target/debug/
。 - 发布模式(优化编译):
cargo build --release
- 可执行文件在
target/release/
,体积更小,性能更高。
4. 管理依赖
Cargo 通过 Cargo.toml
管理项目依赖,依赖的包称为 crates,通常从 crates.io 下载。
4.1 添加依赖
编辑 Cargo.toml
,在 [dependencies]
部分添加依赖。例如,添加 rand
库(用于生成随机数):
[dependencies]
rand = "0.8.5"
4.2 使用依赖
在 src/main.rs
中使用 rand
:
use rand::Rng;
fn main() {
let random_num = rand::thread_rng().gen_range(1..=100);
println!("随机数: {}", random_num);
}
运行 cargo build
或 cargo run
,Cargo 会自动下载并编译 rand
及其依赖。
4.3 依赖版本说明
rand = "0.8.5"
:指定具体版本。rand = "^0.8.5"
:允许次要版本更新(如 0.8.x,但不会升级到 0.9.x)。rand = "*"
:使用最新版本(不推荐,可能会破坏兼容性)。
4.4 更新依赖
更新依赖到最新兼容版本:
cargo update
查看依赖树:
cargo tree
(需先安装:cargo install cargo-tree
)
5. 常用 Cargo 命令
以下是 Cargo 的核心命令,涵盖开发、测试和发布流程:
5.1 构建和运行
cargo build
:编译项目(调试模式)。cargo build --release
:编译发布模式(优化)。cargo run
:编译并运行。cargo check
:快速检查代码是否可编译,不生成可执行文件。
5.2 测试
Cargo 支持运行单元测试和集成测试。
示例:在 src/main.rs
中添加测试:
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
运行测试:
cargo test
输出:
running 1 test
test tests::it_works ... ok
5.3 格式化和检查
- 格式化代码(遵循 Rust 风格指南):
cargo fmt
(需安装 rustfmt
:rustup component add rustfmt
)
- 静态分析(检查潜在问题):
cargo clippy
(需安装 clippy
:rustup component add clippy
)
5.4 文档和发布
- 生成文档:
cargo doc --open
- 文档生成在
target/doc/
,并自动在浏览器打开。 - 清理项目(删除
target/
目录):
cargo clean
- 发布到 crates.io:
cargo publish
(需先在 crates.io 注册并配置 API 令牌)。
6. 项目类型
Cargo 支持两种项目类型:
- 二进制项目(默认,包含
main.rs
):
- 用于生成可执行程序。
- 示例:命令行工具。
- 库项目:
- 用于生成可重用的库,包含
lib.rs
。 - 创建命令:
bash cargo new --lib my_library
示例 Cargo.toml
(库项目):
[package]
name = "my_library"
version = "0.1.0"
edition = "2021"
[lib]
name = “my_library” path = “src/lib.rs”
7. 配置 Cargo
7.1 自定义构建
在项目根目录创建 .cargo/config.toml
,可以自定义构建行为。例如,设置国内镜像加速依赖下载:
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = “https://mirrors.ustc.edu.cn/crates.io-index”
常用镜像:
- 中国科技大学:
https://mirrors.ustc.edu.cn/crates.io-index
- 清华大学:
https://mirrors.tuna.tsinghua.edu.cn/crates.io-index
7.2 环境变量
设置环境变量以控制 Cargo 行为。例如:
export RUST_LOG=debug
cargo run
用于启用日志输出(需配合 env_logger
库)。
8. 高级功能
8.1 工作空间(Workspace)
工作空间允许多个相关项目共享 target/
目录和依赖。创建工作空间:
- 创建目录并添加
Cargo.toml
:
[workspace]
members = ["project1", "project2"]
- 在
project1
和project2
目录下分别创建子项目。
8.2 自定义构建脚本
在 Cargo.toml
中添加 [build-dependencies]
和 build.rs
文件,用于自定义构建逻辑。例如,自动生成代码或编译 C 依赖。
示例 build.rs
:
fn main() {
println!("cargo:rerun-if-changed=build.rs");
// 自定义构建逻辑
}
8.3 条件编译
使用 cfg
属性或 features
控制条件编译。在 Cargo.toml
中定义特性:
[features]
default = []
extra = ["rand"]
在代码中使用:
#[cfg(feature = "extra")]
use rand::Rng;
9. 注意事项
- 依赖冲突:
- 如果多个依赖使用不同版本的同一 crate,可能导致冲突。
cargo tree
可帮助诊断。
- 网络问题:
- 中国大陆用户建议配置镜像(如 USTC 或清华)加速依赖下载。
- 性能优化:
- 使用
cargo check
快速验证代码。 - 发布时使用
--release
优化性能。
- 错误处理:
- 仔细阅读 Cargo 错误信息,通常包含修复建议。
- 使用
cargo --verbose
获取详细日志。
10. 示例:构建一个简单的命令行工具
创建一个生成随机密码的工具:
- 创建项目:
cargo new password_generator
cd password_generator
- 编辑
Cargo.toml
:
[package]
name = "password_generator"
version = "0.1.0"
edition = "2021"
[dependencies]
rand = “0.8.5”
- 编辑
src/main.rs
:
use rand::Rng;
fn main() {
let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let password: String = (0..12)
.map(|_| {
let idx = rand::thread_rng().gen_range(0..chars.len());
chars.chars().nth(idx).unwrap()
})
.collect();
println!("生成的密码: {}", password);
}
- 运行:
cargo run
输出示例:
生成的密码: kX9mPqW2nR5j
11. 总结
Cargo 是 Rust 开发的核心工具,简化了项目管理、依赖处理和构建流程。核心功能包括:
- 创建项目:
cargo new
。 - 管理依赖:在
Cargo.toml
添加 crates。 - 构建和运行:
cargo build
、cargo run
。 - 测试和检查:
cargo test
、cargo fmt
、cargo clippy
。 - 高级功能:工作空间、自定义构建、条件编译。
通过本教程,你可以快速上手 Cargo 并开始开发 Rust 项目。如果需要更深入的内容(如发布到 crates.io、集成测试、或特定场景的配置),请告诉我!