使用Rust的单一代码库:大型项目的代码组织

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

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

开始课程

介绍

随着Rust项目的增长,如何组织代码使其保持可维护性、可扩展性并便于团队协作成为一个关键问题。一种流行的方法是使用单一代码仓库(monorepo)。本文将介绍什么是单一代码仓库,如何通过Cargo workspace进行组织,并提供实际示例。您将学习如何结构化代码、管理依赖关系以及避免常见错误。

什么是单一代码仓库,为什么Rust需要它?

单一代码仓库(monorepo)是一个包含多个项目(crate)或包的统一代码仓库。与每个项目独立存放的多仓库不同,单一代码仓库将所有内容整合在一起:库、二进制文件、测试、配置和文档。

Rust使用单一代码仓库的优势:

  • 统一的依赖版本 — 所有crate使用相同版本的外部包,减少冲突。
  • 简化重构 — 对某个库的修改会立即反映在所有依赖它的crate中。
  • 端到端集成 — 可以轻松对整个项目运行测试和代码检查。
  • 集中化文档 — 所有文档和CI/CD配置集中管理。

然而,单一代码仓库并非适用于所有场景。对于小型项目或开发周期不同的团队,多仓库可能是更好的选择。但对于Rust生态系统而言,模块化和代码复用是常态,单一代码仓库成为一种强大的工具。

使用Cargo Workspace组织单一代码仓库

Cargo支持workspace机制——这是一组共同构建并共享同一个Cargo.lock文件的crate。让我们来看基本结构。

创建workspace

创建根目录和Cargo.toml文件,其中不包含[package]部分,而是使用[workspace]部分:

# 根目录 Cargo.toml
[workspace]
members = [
    "core",
    "cli",
    "web",
]

现在创建子目录core、cli、web。每个目录中都需要有自己的Cargo.toml文件,包含标准的包结构。例如,core的配置:

# core/Cargo.toml
[package]
name = "my_core"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }

对于cli和web,可以添加对my_core的依赖:

# cli/Cargo.toml
[package]
name = "my_cli"
version = "0.1.0"
edition = "2021"

[dependencies]
my_core = { path = "../core" }
clap = { version = "4.0", features = ["derive"] }

现在,从根目录运行cargo build将构建所有crate,并且Cargo.lock文件将是共享的。

文件夹和模块结构

推荐的Rust单一代码仓库结构:

my_monorepo/
├── Cargo.toml          # workspace
├── Cargo.lock
├── core/               # 包含通用类型的库
│   ├── Cargo.toml
│   └── src/
│       └── lib.rs
├── cli/                # 命令行应用程序
│   ├── Cargo.toml
│   └── src/
│       └── main.rs
├── web/                # Web服务器(例如基于Actix)
│   ├── Cargo.toml
│   └── src/
│       └── main.rs
├── tests/              # 集成测试(可选)
│   └── integration_test.rs
├── scripts/            # CI/CD脚本
└── README.md

在每个crate内部,使用标准的Rust模块结构。例如,在core/src/lib.rs中:

// core/src/lib.rs
pub mod models;
pub mod utils;

在core/src/models.rs中:

// core/src/models.rs
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct                

博客

书籍推荐