使用Cargo

Cargo: Rust 的项目管理神器

rustc 直接编译文件,对一两个文件的小程序没问题。但真实项目往往有几十个源文件、十几个外部依赖——这时候手动调用 rustc 就变成了噩梦。Cargo 是 Rust 官方给出的答案,也是你日后每天都会用到的工具。

什么是 Cargo?

Cargo 同时扮演两个角色:

角色职责
构建系统编译代码、处理编译顺序、管理多文件项目
包管理器下载、编译、管理第三方库(crate)

Cargo 随 Rust 工具链一起安装。先确认它可用:

cargo --version

看到类似 cargo 1.xx.x 的输出就说明一切正常。

Rust 工具家族速览:

  • rustup:工具链管理器,用于安装和切换 Rust 版本
  • rustc:Rust 编译器,把 .rs 源文件编译成机器码
  • cargo:构建系统 + 包管理器(底层仍调用 rustc
  • rustfmt:代码格式化工具,自动整理代码风格

用 Cargo 创建项目

回到 projects 目录,执行:

cargo new hello_cargo
cd hello_cargo

一条命令,Cargo 帮你做了三件事:

  1. 创建 hello_cargo 目录和标准项目结构
  2. 生成开箱即用的 Cargo.toml 配置文件
  3. 初始化 Git 仓库(含 .gitignore

Cargo 生成的 src/main.rs 已经是一个完整程序,点击运行看看:

fn main() {
    println!("Hello, world!");
}

如果已有一个没用 Cargo 管理的项目,只需把源文件移到 src/ 目录,再创建对应的 Cargo.toml,即可迁移成 Cargo 项目。

项目结构一览

cargo new 创建的目录结构:

hello_cargo/
├── Cargo.toml      ← 项目配置文件
├── Cargo.lock      ← 依赖版本锁定文件(首次构建后自动生成)
├── .gitignore      ← 自动忽略 target/ 目录
└── src/
    └── main.rs     ← 源代码入口

Cargo 的约定:源文件只放在 src/,根目录只放配置、文档和授权文件。 这个约定让所有 Cargo 项目拥有一致的布局,你接手任何陌生项目都能快速找到源文件。

Cargo.toml 详解

Cargo.toml 是项目的”身份证”,TOML 格式,内容简洁:

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

[dependencies]

逐段解读:

[package] 表块——描述这个包本身的信息:

  • name:包名,也是编译出的可执行文件名
  • version:版本号,遵循语义化版本(semver)惯例,格式为 主版本.次版本.修订版
  • edition:使用的 Rust 语言大版本,目前推荐 2021

[dependencies] 表块——列出项目依赖的外部 crate。现在是空的;需要引入第三方库时在这里添加一行即可,Cargo 会自动下载和编译。

crate 是 Rust 代码包的单位,相当于 Node.js 的 npm package 或 Python 的 pip 包。Rust 的官方 crate 仓库是 crates.io,目前有超过 15 万个 crate。

构建与运行

cargo build:编译项目

在项目根目录执行:

cargo build

Cargo 编译 src/main.rs,可执行文件放到 target/debug/ 目录下:

./target/debug/hello_cargo       # Linux / macOS
.\target\debug\hello_cargo.exe   # Windows

首次构建时还会生成 Cargo.lock,记录所有依赖的精确版本——不需要手动编辑,Cargo 全程自动维护。

target/ 目录体积大、随时可重新生成,Cargo 已在 .gitignore 中帮你排除,不会被提交到 Git 仓库。

cargo run:编译 + 运行一步到位

开发时最常用的命令:

cargo run

cargo run 等于 cargo build + 运行,一步完成。如果源文件自上次编译后没有改动,Cargo 会直接运行已有的可执行文件,跳过编译,节省等待时间。

来验证它的工作方式——下面是 Cargo 管理的项目中 main.rs 的典型内容:

fn main() {
    println!("由 Cargo 构建并运行!");
}

cargo check:快速语法检查

cargo check

cargo check 只检查代码能否通过编译,不生成可执行文件。因为省略了代码生成阶段,它通常比 cargo build 快 5~10 倍。

实际开发中,很多 Rust 开发者会养成这样的习惯:边写代码边频繁运行 cargo check,确保没有语法和类型错误;等到真正需要测试运行效果时,才执行 cargo run

cargo build —release:发布构建

cargo build --release

加上 --release 标志后,Cargo 开启全套编译优化,生成性能最优的可执行文件,放到 target/release/ 目录。

两种模式的对比:

模式命令编译速度运行性能输出目录
开发模式cargo build含调试信息,未优化target/debug/
发布模式cargo build --release最大化优化target/release/

做性能测试(benchmark)时,必须用 --release 版本——开发模式包含大量调试信息、禁用了优化,测出的数据会严重失真。

小结

这五条命令覆盖了日常 90% 的需求:

命令用途
cargo new <name>创建新项目(在当前目录下新建项目目录)
cargo init将当前目录创建为新项目
cargo build编译(开发模式)
cargo run编译 + 运行(最常用)
cargo check只检查语法,不生成文件(最快)
cargo build --release编译发布版(最优化)

不管你在 Linux、macOS 还是 Windows 上,这些命令完全一致——这是 Cargo 跨平台一致性的体现。

练习题

工具定位

加载题目中…

rustup 的职责

加载题目中…

cargo check 的特点

加载题目中…

发布构建

加载题目中…

Rust 工具箱

加载题目中…

填空:工具速查表

将下方备选描述填入对应工具的 "" 中,让程序输出完整的工具速查表。每条描述只用一次。

备选描述:

  • "Rust 编译器"
  • "包管理器 + 构建工具(最常用的命令)"
  • "版本管理器本身"
  • "代码格式化工具"
  • "代码检查(lint)工具"
  • "LSP 服务器(IDE 代码补全的基础)"
fn main() {
    println!("rustc:         {}", "");  // 填入对应的作用
    println!("cargo:         {}", "");
    println!("rustup:        {}", "");
    println!("rustfmt:       {}", "");
    println!("clippy:        {}", "");
    println!("rust-analyzer: {}", "");
}