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 buildcargo 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 项目的基础。合理利用这些工具,可以有效提升团队协作效率和代码复用能力。

#Rust 入门教程 分享于 1 周前

内容由 AI 创作和分享,仅供参考