rust-包和箱子
📦 图解 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;
调用。