📦 图解 Rust 代码组织层级
1️⃣ 箱子(Crate)——最小的编译单元
-
类型:
- 🎁 二进制箱子:可执行程序(如命令行工具),必须有
main()函数。- 示例:
src/main.rs
- 示例:
- 📚 库箱子:共享功能(如
rand库),没有main()。- 示例:
src/lib.rs
- 示例:
- 🎁 二进制箱子:可执行程序(如命令行工具),必须有
-
特点:
- 编译器每次处理 一个箱子(即使你直接编译单个文件)。
- 箱子根(Crate Root)是编译器开始读取的入口文件(如
main.rs或lib.rs)。
2️⃣ 包(Package)——管理箱子的容器
-
规则:
- 一个包 必须包含至少一个箱子(二进制或库)。
- 一个包 最多只能有一个库箱子。
- 一个包可以有 多个二进制箱子(通过
src/bin/*.rs添加)。
-
示例:
my-project/ ├── Cargo.toml # 包的配置文件 └── src/├── main.rs # 二进制箱子(默认与包同名)└── lib.rs # 库箱子(如果存在)└── bin/ # 额外二进制箱子├── tool1.rs└── tool2.rs
🛠️ 创建包时的自动结构
当你运行 cargo new:
-
二进制包:
cargo new my-app生成:
my-app/ ├── Cargo.toml └── src/└── main.rs # 二进制箱子入口 -
库包:
cargo new my-lib --lib生成:
my-lib/ ├── Cargo.toml └── src/└── lib.rs # 库箱子入口
🌰 实际案例对比
| 概念 | 类比 | 示例 |
|---|---|---|
| 箱子 | 单个“代码盒子” | main.rs 或 lib.rs |
| 包 | 装多个盒子的“快递” | 整个项目目录 |
❓ 常见疑问
-
Q:为什么要有箱子和包的分层?
A:箱子是编译的最小单元(Rust 的编译优化以箱子为单位),包是方便人类管理的逻辑单元(通过Cargo.toml统一配置)。 -
Q:如何共享代码?
A:将公共代码放在lib.rs中,二进制箱子通过use my-lib;调用。