rust-包和箱子

📦 图解 Rust 代码组织层级

包含 分为 或 可以包含 Package Crate 二进制 Crate 库 Crate main.rs lib.rs 多个二进制 Crate src/bin/*.rs


1️⃣ 箱子(Crate)------最小的编译单元

  • 类型

    • 🎁 二进制箱子 :可执行程序(如命令行工具),必须有 main() 函数。
      • 示例:src/main.rs
    • 📚 库箱子 :共享功能(如 rand 库),没有 main()
      • 示例:src/lib.rs
  • 特点

    • 编译器每次处理 一个箱子(即使你直接编译单个文件)。
    • 箱子根(Crate Root)是编译器开始读取的入口文件(如 main.rslib.rs)。

2️⃣ 包(Package)------管理箱子的容器

  • 规则

    • 一个包 必须包含至少一个箱子(二进制或库)。
    • 一个包 最多只能有一个库箱子
    • 一个包可以有 多个二进制箱子 (通过 src/bin/*.rs 添加)。
  • 示例

    bash 复制代码
    my-project/
    ├── Cargo.toml  # 包的配置文件
    └── src/
        ├── main.rs    # 二进制箱子(默认与包同名)
        └── lib.rs     # 库箱子(如果存在)
        └── bin/       # 额外二进制箱子
            ├── tool1.rs
            └── tool2.rs

🛠️ 创建包时的自动结构

当你运行 cargo new

  • 二进制包

    bash 复制代码
    cargo new my-app

    生成:

    复制代码
    my-app/
    ├── Cargo.toml
    └── src/
        └── main.rs   # 二进制箱子入口
  • 库包

    bash 复制代码
    cargo new my-lib --lib

    生成:

    复制代码
    my-lib/
    ├── Cargo.toml
    └── src/
        └── lib.rs    # 库箱子入口

🌰 实际案例对比

概念 类比 示例
箱子 单个"代码盒子" main.rslib.rs
装多个盒子的"快递" 整个项目目录

常见疑问

  • Q :为什么要有箱子和包的分层?
    A :箱子是编译的最小单元(Rust 的编译优化以箱子为单位),包是方便人类管理的逻辑单元(通过 Cargo.toml 统一配置)。

  • Q :如何共享代码?
    A :将公共代码放在 lib.rs 中,二进制箱子通过 use my-lib; 调用。