使用Rust的单一仓库:代码组织实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

单仓库与Rust:代码组织的实践指南

单仓库(monorepo)是一种将多个项目或组件存储在单一仓库中的代码管理方法。在Rust生态系统中,由于Cargo Workspace的内置支持,这种做法尤为流行。本文将探讨如何使用Rust实践单仓库:从创建结构到管理依赖和测试。您将学习如何避免常见错误,并使代码库具有可扩展性。



什么是Cargo Workspace以及为何需要它

Cargo Workspace是一种机制,允许您在单个项目中管理多个crate(库或可执行程序)。无需为每个组件创建单独的仓库,而是将它们整合到一个统一的结构中。这提供了几个优势:

  • 统一构建系统 — 单个cargo build命令即可构建所有crate。
  • 共享依赖 — 重复依赖只需解析一次,减少了最终二进制文件的大小。
  • 简化测试 — 您可以使用单个命令运行所有crate的测试。
  • 版本一致性 — 所有组件使用相同版本的库。

单仓库对于微服务、通用库或具有明确分层结构(例如核心层、API层、CLI层)的项目尤其有用。



创建单仓库结构

让我们从一个实际示例开始。假设我们正在开发一个任务管理系统。我们将有三个crate:

  • core — 包含业务逻辑的库。
  • cli — 用于命令行的可执行程序。
  • server — 网络服务器(可执行程序)。

首先,创建根目录和用于工作区的Cargo.toml文件:

mkdir task_managercd task_manager# 创建根目录的Cargo.tomltouch Cargo.toml

在根目录的Cargo.toml中,指定工作区:

[workspace]members = [    "core",    "cli",    "server",]

现在使用cargo new创建每个crate:

cargo new core --libcargo new clicargo new server

之后,结构将如下所示:

task_manager/├── Cargo.toml          # 根工作区├── core/│   ├── Cargo.toml│   └── src/│       └── lib.rs├── cli/│   ├── Cargo.toml│   └── src/│       └── main.rs└── server/    ├── Cargo.toml    └── src/        └── main.rs

注意:根目录的Cargo.toml不包含[package]部分,只有[workspace]。这对于正确运行非常重要。



管理crate之间的依赖关系

单仓库中的关键任务之一是正确设置crate之间的依赖关系。在我们的示例中,cli和server依赖于core。让我们在它们的Cargo.toml文件中指定这一点:

对于cli/Cargo.toml:

[package]name = "cli"version = "0.1.0"edition = "2021"

[dependencies]core = { path = "../core" }clap = { version = "4.0", features = ["derive"] } # 用于CLI的外部依赖

对于server/Cargo.toml:

[package]name = "server"version = "0.1.0"edition = "2021"

[dependencies]core = { path = "../core" }actix-web = "4" # 用于网络服务器的外部依赖

在根目录的Cargo.toml中,如果所有crate都需要公共依赖,您也可以指定它们,但这通常是单独进行的。然而,工作区允许解决版本冲突:如果两个crate使用相同的库,Cargo将自动拉取一个版本。

博客

书籍推荐