rust学习
1. 项目组织结构
工程
# 创建一个工程
cargo new my-project
工作空间
在 Rust 中,工作空间(Workspace) 是一个包含多个 Rust 项目的共享环境,用于管理多个 crate(库或可执行文件)。它允许多个 Rust 项目共享 Cargo.lock
、依赖项和 target/
目录,提高编译效率,并且适用于多包管理、模块化开发。
🔹 为什么使用 Rust 工作空间?
Rust 工作空间适用于以下场景:
管理多个相关的 crate(类似于 monorepo)
- 比如,你有一个主程序
app
,但app
依赖于lib1
和lib2
,可以用工作空间管理它们。
- 比如,你有一个主程序
共享依赖,减少重复构建,提高编译速度。
- 例如
app
和lib1
都依赖serde
,Rust 只会编译一次。
- 例如
统一管理
Cargo.lock
,保证所有 crate 依赖版本一致。
🔹 如何创建 Rust 工作空间?
1️⃣ 创建一个 Rust 项目
mkdir my_workspace
cd my_workspace
cargo new --lib lib1
cargo new --lib lib2
cargo new --bin app
你会得到如下目录结构:
my_workspace/
├── Cargo.toml # 工作空间的根 Cargo.toml
├── lib1/
│ ├── Cargo.toml
│ ├── src/
│ │ └── lib.rs
├── lib2/
│ ├── Cargo.toml
│ ├── src/
│ │ └── lib.rs
├── app/
│ ├── Cargo.toml
│ ├── src/
│ │ └── main.rs
2️⃣ 配置 Cargo.toml
在 my_workspace/Cargo.toml
(根目录)中添加:
[workspace]
members = ["lib1", "lib2", "app"]
resolver = "2" # 使用 Cargo v2 依赖解析
这样,Rust 知道这 3 个项目属于同一个工作空间。
3️⃣ 在 app
依赖 lib1
和 lib2
修改 app/Cargo.toml
:
[dependencies]
lib1 = { path = "../lib1" }
lib2 = { path = "../lib2" }
在 app/src/main.rs
:
use lib1::hello;
use lib2::world;
fn main() {
hello();
world();
}
在 lib1/src/lib.rs
:
pub fn hello() {
println!("Hello from lib1!");
}
在 lib2/src/lib.rs
:
pub fn world() {
println!("World from lib2!");
}
4️⃣ 运行工作空间
你可以在 my_workspace/
目录下直接运行:
cargo run -p app
输出:
Hello from lib1!
World from lib2!
你也可以一次性编译所有 crate:
cargo build
🔹 工作空间的额外功能
✔ 共享 Cargo.lock
所有 crate 共享 Cargo.lock
,保证相同的依赖版本:
my_workspace/
├── Cargo.lock # 统一管理所有 crate 的依赖
├── ...
✔ 使用 workspace.dependencies
如果多个 crate 需要相同的依赖项,可以在根 Cargo.toml
统一声明:
[workspace.dependencies]
serde = "1.0"
然后,在 lib1/Cargo.toml
和 lib2/Cargo.toml
这样写:
[dependencies]
serde = { workspace = true }
这样可以确保 lib1
和 lib2
使用相同版本的 serde
,避免版本冲突。
🔹 总结
✅ Rust 工作空间 适用于管理多个 crate,优点包括:
- 提高编译效率(共享
target/
) - 统一依赖管理(共享
Cargo.lock
和workspace.dependencies
) - 模块化开发(适合 Monorepo)
适用于:
- 大型项目(微服务、多组件)
- 库+CLI 工具
- 框架开发(如 Web 框架)
你有具体的 Rust 项目需求吗?我可以帮你优化工作空间结构! 🚀
2. 常使用的库
- serde = { version = “1.0”, features = [“derive”] } # 序列化支持
- serde_json = “1.0” # JSON 序列化
- tokio = { version = “1.35”, features = [“full”] }
- axum = “0.7.9”