如何组织大型Rust代码库
随着 Rust 项目规模的扩大,保持代码库的整洁和高效变得愈加重要。以下是一些管理大型 Rust 代码库的简单规则,旨在减少复杂性和技术债务,让任何开发者都能快速上手(仅供参考)。
提供开发容器
提供至少一个包含所有依赖项的 Dockerfile,以确保开发环境的一致性和不可变性。理想情况下,还应该提供一个 devcontainer 以便开发者能够快速开始工作。
使用工作区(workspaces)
将项目拆分为多个 crate 以减少编译时间并保持代码清晰。Rust 提供了 Cargo Workspaces 来管理共享同一个 Cargo.lock 文件和 target 目录的多个包。典型工作区结构如下:
my_project
│── cmd/
│ ├── executable-1/
│ ├── executable-2/
│── crates/
│ ├── package_1/
│ ├── package_2/
│ ├── package_3/
│── Cargo.toml
│── Cargo.lock
│── target/
cmd 文件夹包含项目的各个可执行文件,crates 文件夹包含所有库和其他非可执行文件。
在工作区级别声明依赖
随着项目的增长,保持所有包的依赖同步变得困难。应在工作区的 Cargo.toml 文件中声明依赖,并在各个包中使用 { workspace = true }
来引用这些依赖。
[workspace.dependencies]
something = { version = "=1.0.0", features = ["a", "b", "c"] }
[dependencies]
something = { workspace = true }
这有助于跟踪所有第三方包及其版本。
不使用 Cargo 的默认文件夹结构默认的 Cargo 文件夹结构在包数量增加后会变得难以管理。建议将代码直接放在 crate 的根目录中,与 Cargo.toml 文件并列:
my_package/
│── my_package.rs
│── Cargo.toml
│── README.md
唯一的例外是包含 build.rs 文件的情况,此时保留 Cargo 的标准布局更好。
不在 mod.rs 和 lib.rs 文件中编写代码避免在 mod.rs 和 lib.rs 文件中编写代码,这些文件应仅用于调整不同类型和函数的可见性。使用描述性的文件名(如 client.rs、email.rs、payments.rs)来编写代码。
提供 Makefile
在工作区的根目录提供一个 Makefile,用于记录构建、测试和维护项目的重要任务,使任何贡献者都能参与维护。
通过遵循这些规则,可以更有效地管理大型 Rust 代码库,确保代码库的整洁和高效。
原文链接 https://kerkour.com/rust-how-to-organize-large-workspaces
Rust实现遗传算法
本文将介绍遗传算法,并实现一个用于训练遗传算法的Rust库。我们将用该库解决以下问题:
求二维实函数的最大值
旅行商问题(TSP)
背包问题
原文链接 https://vaktibabat.github.io/posts/Genetic_Algo_Rust/
Cargo生态缺失的部分
原文链接 https://weihanglo.tw/posts/2024/the-missing-parts-in-cargo/
micropb: 运行在嵌入式环境的 protobuf库
micropb 一个目标为嵌入式和 no_std 环境的 protobuf库, 除此之外, 他提供高度可配置的生成代码模式.
github地址 https://github.com/YuhanLiin/micropb
--
From 日报小组 BobQ, FBI小白
社区学习交流平台订阅:
Rustcc论坛: 支持rss
微信公众号:Rust语言中文社区