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.rssrc/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 的局限 #

已知限制 #

  1. 编译速度:相比 C/C++,编译时间较长
  2. 二进制大小:默认静态链接,二进制较大
  3. 跨平台编译:需要额外配置

解决方案 #

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