如果你刚开始学习 Rust,你一定会在命令行中接触到
cargo
。这是 Rust 的官方构建和包管理工具,本篇文章将从零开始,详细讲解它的使用、配置文件、运行模式、进阶用法等,让你真正搞懂 Cargo!
✨ 目录
- Cargo 是什么?
- 如何使用 Cargo 创建和运行项目
- Cargo 项目结构讲解
- Cargo.toml 与 Cargo.lock 是什么?
- 运行与编译模式:debug 和 release
- 进阶功能一:features(功能切换)
- 进阶功能二:workspace(多包管理)
- 常用命令汇总
- 总结
Cargo 是什么?
Cargo 是 Rust 官方自带的构建系统和包管理器,作用类似于:
- JavaScript 的
npm
- Python 的
pip
- Java 的
maven
你可以用它来:
- 创建新项目
- 编译项目
- 管理依赖包
- 发布项目到 crates.io
如何使用 Cargo 创建和运行项目
打开命令行,输入:
cargo new hello-rust
它会生成如下结构:
hello-rust/
├── Cargo.toml
└── src/
└── main.rs
进入目录并运行:
cd hello-rust
cargo run
输出:
Hello, world!
Cargo 项目结构讲解
Cargo.toml
:项目配置文件,写明项目名、版本、依赖等。Cargo.lock
:锁定依赖的具体版本,保证每次构建一致。src/main.rs
:项目入口,相当于 Java 的main()
。target/
:编译后的输出目录,默认会创建debug
和release
文件夹。
Cargo.toml 与 Cargo.lock 是什么?
Cargo.toml
—— 配置文件(你写)
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
[dependencies]
rand = "0.8"
解释:
[package]
是包信息[dependencies]
是你要用的库
Cargo.lock
—— 锁定文件(自动生成)
记录每个依赖的 具体版本号和来源路径,防止别人运行你项目时下到不同的版本。
举例:
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
运行与编译模式:debug 和 release
Rust 支持两种主要构建模式:
🔧 Debug 模式(默认)
cargo build # 编译
cargo run # 编译 + 运行
特点:
- 编译快
- 包含调试信息
- 可读性高但运行性能稍低
🚀 Release 模式(优化后)
cargo build --release
cargo run --release
特点:
- 编译慢(优化耗时)
- 没有调试信息
- 性能最佳(适合部署)
输出目录:target/release/
而不是 target/debug/
进阶功能一:features(功能切换)
📌 场景:如果你希望某个模块是可选的,比如 CLI 命令解析、加密支持,就可以用 features
。
🧠 背后原理
Rust 提供 条件编译:代码在某些编译条件下才会生效。
✨ 示例说明:
Cargo.toml
[dependencies]
regex = { version = "1", optional = true }
[features]
default = [] # 默认不开启任何功能
cli = ["regex"] # 开启 feature "cli" 时,启用 regex
src/main.rs
#[cfg(feature = "cli")]
fn run_cli() {
println!("运行 CLI 模式");
}
fn main() {
// 如果启用了 feature cli,就调用 run_cli()
#[cfg(feature = "cli")]
run_cli();
// 如果没有启用 cli,就走这里
#[cfg(not(feature = "cli"))]
println!("未启用 CLI 模式");
}
🛠️ 如何运行?
cargo run --features cli # 输出:运行 CLI 模式
cargo run # 输出:未启用 CLI 模式
进阶功能二:workspace(多包管理)
📌 场景:如果你有多个 crate,比如一个库 + 多个工具模块,就需要 workspace
🧠 背后原理
通过 workspace
,你可以:
- 多个 crate 统一管理依赖
- 提高编译缓存效率
- 模块之间引用简单
✨ 示例结构
my-workspace/
├── Cargo.toml # 顶层
├── lib1/
│ └── Cargo.toml
└── app/
└── Cargo.toml
顶层 Cargo.toml
[workspace]
members = ["lib1", "app"]
app/Cargo.toml
[dependencies]
lib1 = { path = "../lib1" }
app/src/main.rs
use lib1::say_hi;
fn main() {
say_hi();
}
lib1/src/lib.rs
pub fn say_hi() {
println!("Hello from lib1!");
}
运行:
cargo run -p app
常用命令汇总
命令 | 含义 |
---|---|
cargo new proj | 创建新项目 |
cargo build | 编译 debug 模式 |
cargo build --release | 编译 release 模式 |
cargo run | 编译 + 运行 |
cargo test | 运行测试 |
cargo clean | 清除缓存 |
cargo update | 更新依赖 |
cargo doc --open | 本地文档生成 + 打开 |
cargo check | 检查语法,不编译生成目标文件 |
总结
Rust 之所以被称为“工程师的语言”,是因为它把代码质量和工程实践融合得非常深入,而 Cargo 就是这种理念的体现。
应该掌握的:
- 如何用 Cargo 创建、运行、管理项目
Cargo.toml
和Cargo.lock
的作用与区别- 如何使用
features
做功能开关 - 如何通过
workspace
组织大型项目 - 构建优化(debug/release)
- 常见命令操作