在 Rust 中,Package(包)、Crate(单元) 和 Module(模块) 是组织代码的三个核心概念。理解它们的关系对编写清晰、可维护的 Rust 项目至关重要。
Cargo.toml
pub
✅ 一句话总结: 一个 Package 包含一个或多个 Crates;一个 Crate 由 Modules 组成。
cargo new my-project # 默认创建 bin package cargo new --lib my-lib # 创建 lib package
Bin package(可执行):
[package] name = "my-app" version = "0.1.0" [[bin]] name = "my-app" # 对应 src/main.rs
Lib package(库):
[package] name = "my-lib" version = "0.1.0" [lib] name = "my_lib" # 对应 src/lib.rs
同时包含 lib 和 bin(常见于 CLI 工具库):
my-package/ ├── Cargo.toml ├── src/ │ ├── lib.rs ← lib crate │ └── main.rs ← bin crate (name = package name) └── src/bin/ ← 额外的可执行文件 └── tool2.rs
🔸 一个 package 只能有一个 lib crate,但可以有多个 bin crate。
每个 crate 有独立的根(root):
src/lib.rs
src/main.rs
src/bin/*.rs
crate 是编译和链接的最小单位 当你 cargo build,Rust 会为每个 crate 生成一个 .rlib 或可执行文件。
cargo build
.rlib
外部依赖也是 crate 例如 serde、tokio 都是独立的 crates,通过 Cargo.toml 引入。
serde
tokio
Module 用于 组织代码结构 和 控制访问权限。
// src/lib.rs 或 main.rs mod network { pub fn connect() { println!("Connecting..."); } fn private_helper() {} // 默认私有 }
fn main() { network::connect(); // ✅ 可访问 pub 函数 // network::private_helper(); // ❌ 编译错误 }
// src/network.rs pub fn connect() { ... }
在 lib.rs 或 main.rs 中声明:
lib.rs
main.rs
mod network; // 自动加载 src/network.rs
src/ ├── lib.rs └── network/ ├── mod.rs ← 模块根 ├── tcp.rs └── udp.rs
src/lib.rs:
mod network;
src/network/mod.rs:
src/network/mod.rs
pub mod tcp; pub mod udp;
💡 从 Rust 2018 起,也可以不用 mod.rs,直接用 network.rs + network/tcp.rs,但传统方式更清晰。
mod.rs
network.rs
network/tcp.rs
fn foo()
pub fn foo()
pub(crate) fn foo()
pub(super) fn foo()
pub(in path) fn foo()
示例:
mod outer { pub mod inner { pub(super) fn visible_to_outer() {} pub fn visible_everywhere() {} } } // outer::inner::visible_everywhere() ✅ // outer::inner::visible_to_outer() ✅(因为 outer 是 super) // inner::visible_to_outer() ❌(不在 outer 内)
在 Cargo.toml 添加依赖:
[dependencies] serde = "1.0" rand = "0.8"
在代码中引入:
use serde::{Serialize, Deserialize}; use rand::Rng; #[derive(Serialize)] struct Point { x: i32, y: i32 }
外部 crate 默认以 crate 名作为根模块名(如 serde、rand)。
rand
my-cli/ ├── Cargo.toml ├── src/ │ ├── main.rs // bin crate root │ ├── lib.rs // lib crate root │ └── commands/ │ ├── mod.rs │ ├── start.rs │ └── stop.rs
Cargo.toml:
[package] name = "my-cli" version = "0.1.0" [[bin]] name = "my-cli" path = "src/main.rs" [lib] name = "my_cli" path = "src/lib.rs"
pub mod commands;
src/commands/mod.rs:
src/commands/mod.rs
pub mod start; pub mod stop;
src/main.rs:
use my_cli::commands; fn main() { commands::start::run(); }
mod foo;
foo.rs
foo/mod.rs
如果你正在设计一个库或 CLI 工具,建议:
pub use
需要我帮你设计具体项目的模块结构吗?
Github开源生信云平台 DEMO