Cargo 简介 #
什么是 Cargo? #
Cargo 是 Rust 编程语言的官方包管理器和构建系统。它由 Rust 核心团队开发和维护,是 Rust 工具链的标准组成部分。Cargo 集成了项目管理、依赖管理、编译构建、测试运行、文档生成、包发布等功能,为 Rust 开发者提供了一站式的项目管理体验。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ Cargo │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 项目管理 │ │ 依赖管理 │ │ 构建系统 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 测试框架 │ │ 文档生成 │ │ 包发布 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
Cargo 的历史 #
发展历程 #
text
2011年 ─── Cargo 项目启动
│
│ 作为 Rust 的配套工具开始开发
│
2012年 ─── 首次发布
│
│ 随 Rust 0.1 版本一同发布
│
2015年 ─── Rust 1.0 发布
│
│ Cargo 成为 Rust 官方标准工具
│ crates.io 正式上线
│
2016年 ─── 快速发展
│
│ 增量编译支持
│ 工作区功能
│
2018年 ─── 成熟稳定
│
│ 特性标志(Features)
│ 构建脚本增强
│
2020年 ─── 持续优化
│
│ 编译缓存共享
│ 依赖解析优化
│
至今 ─── 生态系统核心
│
│ 超过 10 万个包
│ 日均下载量超过 1 亿次
里程碑版本 #
| 版本 | 时间 | 重要特性 |
|---|---|---|
| 0.1 | 2012 | 基本的项目管理和依赖管理 |
| 1.0 | 2015 | 随 Rust 1.0 稳定发布 |
| 1.20 | 2017 | 工作区支持 |
| 1.24 | 2018 | 增量编译优化 |
| 1.26 | 2018 | 特性标志增强 |
| 1.41 | 2020 | 特性解析器重写 |
| 1.51 | 2021 | 特性解析器 v2 |
为什么需要 Cargo? #
传统开发的痛点 #
在没有 Cargo 之前,Rust 开发者面临以下问题:
bash
# 手动管理依赖
git clone https://github.com/some/dependency.git
cd dependency
make install
# 手动配置编译选项
rustc --opt-level 3 --crate-type lib src/lib.rs
# 手动管理项目结构
mkdir -p src tests examples
# 手动编写 Makefile...
Cargo 的解决方案 #
bash
# 一条命令创建项目
cargo new my_project
# 自动管理依赖(编辑 Cargo.toml)
[dependencies]
serde = "1.0"
# 一条命令构建
cargo build --release
# 标准项目结构自动生成
my_project/
├── Cargo.toml
├── src/
│ └── main.rs
├── tests/
└── examples/
Cargo 的核心特点 #
1. 一体化工具链 #
Cargo 提供了完整的开发工作流支持:
bash
# 开发流程
cargo new my_project # 创建项目
cargo add serde # 添加依赖
cargo run # 运行项目
cargo test # 运行测试
cargo doc # 生成文档
cargo publish # 发布包
2. 确定性构建 #
通过 Cargo.lock 文件确保构建的可重复性:
toml
# Cargo.lock 示例
[[package]]
name = "serde"
version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7371c2a0e6d7e6f6d7b5e5b5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5"
3. 丰富的生态系统 #
crates.io 是 Rust 的官方包仓库:
| 指标 | 数据 |
|---|---|
| 包数量 | 超过 10 万个 |
| 日下载量 | 超过 1 亿次 |
| 活跃开发者 | 数十万 |
| 覆盖领域 | Web、嵌入式、CLI、游戏等 |
4. 安全可靠 #
bash
# 内置安全检查
cargo audit # 检查已知漏洞
cargo tree # 查看依赖树
cargo outdated # 检查过时依赖
5. 高性能 #
- 增量编译:只重新编译修改的部分
- 并行构建:充分利用多核 CPU
- 智能缓存:共享编译缓存
核心概念 #
Package(包) #
Package 是一个或多个 Crate 的集合,包含 Cargo.toml 配置文件。
text
my_package/
├── Cargo.toml # 包配置
├── Cargo.lock # 依赖锁定
├── src/
│ ├── lib.rs # 库 crate
│ └── main.rs # 二进制 crate
├── tests/ # 集成测试
├── examples/ # 示例程序
└── benches/ # 性能测试
Crate(单元包) #
Crate 是 Rust 的编译单元,分为两种类型:
| 类型 | 描述 | 入口文件 |
|---|---|---|
| 库 Crate | 提供可复用的功能 | src/lib.rs |
| 二进制 Crate | 可执行程序 | src/main.rs 或 src/bin/*.rs |
Module(模块) #
Module 是 Crate 内部的代码组织单元:
rust
// src/lib.rs
pub mod network {
pub mod tcp {
pub fn connect() { /* ... */ }
}
pub mod udp {
pub fn bind() { /* ... */ }
}
}
Target(目标) #
Target 定义了编译的目标类型:
| Target 类型 | 描述 |
|---|---|
| lib | 库目标 |
| bin | 二进制目标 |
| example | 示例程序 |
| test | 测试目标 |
| bench | 性能测试目标 |
项目类型 #
二进制项目 #
可执行程序,适合开发应用程序:
bash
cargo new my_app
text
my_app/
├── Cargo.toml
└── src/
└── main.rs # 程序入口
库项目 #
可复用的代码库,适合开发供他人使用的包:
bash
cargo new my_lib --lib
text
my_lib/
├── Cargo.toml
└── src/
└── lib.rs # 库入口
混合项目 #
同时包含库和二进制:
text
my_project/
├── Cargo.toml
└── src/
├── lib.rs # 库
├── main.rs # 主程序
└── bin/
└── cli.rs # 额外的二进制
Cargo 与其他工具对比 #
与 npm (Node.js) 对比 #
| 特性 | Cargo | npm |
|---|---|---|
| 构建系统集成 | ✅ 内置 | ❌ 需要额外工具 |
| 测试框架 | ✅ 内置 | ❌ 需要额外工具 |
| 文档生成 | ✅ 内置 | ❌ 需要额外工具 |
| 锁定文件 | ✅ Cargo.lock | ✅ package-lock.json |
| 工作区 | ✅ 原生支持 | ✅ workspaces |
| 安全审计 | ✅ cargo audit | ✅ npm audit |
与 pip (Python) 对比 #
| 特性 | Cargo | pip |
|---|---|---|
| 构建系统集成 | ✅ 内置 | ❌ 需要额外工具 |
| 虚拟环境 | ✅ target 目录隔离 | ✅ venv |
| 锁定文件 | ✅ Cargo.lock | ❌ 无(需 pipenv) |
| 依赖解析 | ✅ 语义化版本 | ⚠️ 基本支持 |
| 二进制分发 | ✅ 支持 | ❌ 有限支持 |
与 go mod (Go) 对比 #
| 特性 | Cargo | go mod |
|---|---|---|
| 中心仓库 | ✅ crates.io | ❌ 分布式 |
| 版本选择 | ✅ 最小版本选择 | ✅ 最小版本选择 |
| 工作区 | ✅ 支持 | ✅ 支持 |
| 构建缓存 | ✅ 共享缓存 | ✅ 模块缓存 |
Cargo 的设计哲学 #
约定优于配置 #
Cargo 采用合理的默认配置,减少开发者的配置工作:
text
默认项目结构
├── Cargo.toml # 必需
├── src/
│ ├── lib.rs # 库入口(可选)
│ └── main.rs # 程序入口(可选)
├── tests/ # 集成测试(自动识别)
├── examples/ # 示例程序(自动识别)
└── benches/ # 性能测试(自动识别)
零配置开始 #
bash
# 创建项目后立即可以运行
cargo new hello_world
cd hello_world
cargo run
# 输出:Hello, world!
安全默认 #
- 默认使用最新的稳定 Rust 版本
- 默认启用安全检查
- 默认生成优化后的发布版本
Cargo 的局限 #
已知限制 #
- 编译速度:相比 C/C++,编译时间较长
- 二进制大小:默认静态链接,二进制较大
- 跨平台编译:需要额外配置
解决方案 #
bash
# 加速编译
cargo build --release -j 8 # 并行编译
# 减小二进制大小
cargo build --release
strip target/release/my_app # 移除符号信息
# 跨平台编译
rustup target add x86_64-pc-windows-gnu
cargo build --target x86_64-pc-windows-gnu
下一步 #
现在你已经了解了 Cargo 的基本概念,接下来学习 安装与配置 开始实际使用 Cargo!
最后更新:2026-03-28