5.4 包、工作区与依赖管理
Rust 的项目组织和依赖管理由 Cargo 工具统一处理。Cargo 是 Rust 的官方构建系统和包管理器,它通过 Cargo.toml 文件描述项目的元数据、依赖关系和构建配置,使得项目结构清晰、依赖可追踪、构建可重复。
包(crate)的概念
在 Rust 中,包(package)是 Cargo 的基本分发单元,一个包可以包含一个或多个 crate。Crate 是 Rust 的编译单元,分为两种类型:
- 二进制 crate(binary crate):生成可执行程序,入口为
src/main.rs。 - 库 crate(library crate):提供可被其他项目调用的代码,入口为
src/lib.rs。
一个包至少包含一个 crate,且最多只能有一个库 crate,但可以包含多个二进制 crate(通过 src/bin/ 目录下的多个 .rs 文件实现)。
例如,创建一个新包:
cargo new my-project # 创建二进制包
cargo new --lib my-library # 创建库包
Cargo.toml:项目配置文件
每个包的根目录下都有一个 Cargo.toml 文件,用于定义包的基本信息和依赖项。一个典型的配置如下:
[package]
name = "my-project"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = "1.0"
rand = "0.8"
[package]部分描述包本身;[dependencies]列出外部依赖,Cargo 会自动从 crates.io 下载并编译它们。
依赖可以指定版本范围(如 "1.0" 表示兼容 1.x 的最新版),也可以指向 git 仓库、本地路径或工作区成员。
工作区(workspace)
当项目由多个相互关联的包组成时(例如一个核心库加多个工具),可以使用 工作区 将它们组织在一起。
工作区通过在根目录的 Cargo.toml 中声明成员包来定义:
[workspace]
members = [
"core-lib",
"cli-tool",
"web-api",
]
各成员包放在子目录中,各自拥有自己的 Cargo.toml,但共享同一个 target/ 构建目录和依赖锁文件(Cargo.lock)。这使得跨包开发更高效,也便于统一管理版本和依赖。
运行 cargo build 或 cargo test 在工作区根目录时,会作用于所有成员;也可通过 -p 指定特定包:
cargo build -p cli-tool
依赖来源
Cargo 支持多种依赖来源:
- crates.io(默认):
serde = "1.0" - Git 仓库:
my-crate = { git = "https://github.com/user/repo.git", branch = "main" } - 本地路径:
my-local-lib = { path = "../my-local-lib" } - 工作区成员:在工作区内,可通过
path或直接引用(配合[patch]或工作区继承)
小结
通过包、工作区和 Cargo.toml,Rust 提供了一套简洁而强大的项目组织与依赖管理机制。Cargo 不仅简化了构建和测试流程,还确保了依赖的确定性和可复现性。理解 crate、package 和 workspace 的关系,是开发中大型 Rust 项目的基础。合理利用这些工具,可以有效提升团队协作效率和代码复用能力。