2、Cargo与项目管理:使用cargo new创建项目、Cargo.toml详解、cargo build/run/check/test命令、依赖管理与crates.io

好,咱们正式开始接触 Rust 的项目管理工具——Cargo。说实话,我刚学 Rust 那会儿,最让我舒服的就是 Cargo。为什么?因为之前写 C++ 的时候,光是折腾 CMakeLists.txt 和 Makefile 就能耗掉半天。而 Cargo 呢?一条命令,项目骨架就搭好了。嗯,咱们就从这里开始。

2.1 使用 cargo new 创建项目

打开终端,敲下这行命令:

cargo new my_project

你会看到终端输出:

Created binary (application) `my_project` package

然后当前目录下就多了一个 my_project 文件夹。进去看看:

my_project/
├── Cargo.toml
└── src/
    └── main.rs

就这么简单。一个 Cargo.toml 配置文件,一个 src/main.rs 入口文件。我个人习惯,每次开始一个新项目,第一件事就是 cargo new,然后打开 Cargo.toml 看一眼。

小提示: 如果你想创建一个库项目(而不是可执行程序),可以加 --lib 参数:cargo new my_lib --lib。这样生成的是 src/lib.rs 而不是 main.rs

2.2 Cargo.toml 详解

打开 Cargo.toml,你会看到类似这样的内容:

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

[dependencies]

咱们一行一行看。

[package] 区域:这是项目的元信息。

  • name:项目名称,也是发布到 crates.io 时的包名。
  • version:语义化版本号,遵循 主版本.次版本.补丁 格式。
  • edition:Rust 版本。目前主流是 2021,老项目可能是 2018 或 2015。

[dependencies] 区域:这里写你的依赖。目前是空的,后面我们会往里加东西。

除了这些,还有几个常用的字段:

[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
description = "一个简单的 Rust 项目"
authors = ["Your Name <you@example.com>"]
license = "MIT"

我个人建议,从一开始就把 descriptionlicense 写上。为什么?因为如果你以后想把项目发布到 crates.io,这些是必填项。我曾经有个项目,临时想发布,结果发现 description 没写,还得回去补,挺麻烦的。

重点: edition 字段决定了 Rust 编译器使用哪个版本的语法规则。2021 版是最新的,支持了更多现代特性。如果你看到老项目用 2015 或 2018,建议升级到 2021。

2.3 cargo build / run / check / test 命令

这几个命令是你每天都会用到的。咱们一个一个说。

cargo build

编译项目。第一次运行会下载依赖并编译,之后只编译修改过的文件。

cargo build

编译产物在 target/debug/ 目录下。如果你想编译发布版本(带优化),加 --release

cargo build --release

发布版本会放在 target/release/ 里。我个人的习惯是:开发时用 cargo build,要测试性能或准备发布时用 cargo build --release。因为 debug 版本编译快,但运行慢;release 版本编译慢,但运行快。

cargo run

编译并运行项目。相当于 cargo build 然后手动执行可执行文件。

cargo run

如果你只想运行 release 版本:

cargo run --release

cargo check

这个命令我特别推荐。它只检查代码能否编译通过,但不生成可执行文件。所以速度比 cargo build 快很多。

cargo check

我写代码时的习惯是:每改几行就 cargo check 一下,确保没有语法错误。等确认无误了,再 cargo buildcargo run。这样能节省大量等待编译的时间。

cargo test

运行项目中的测试。Rust 的测试是写在代码里的,用 #[test] 标记。

cargo test

它会找到所有带 #[test] 的函数并执行。如果测试通过,你会看到绿色的 ok;如果失败,会显示具体哪一行出了问题。

注意: 如果你在 cargo test 时遇到奇怪的错误,先检查一下 src/lib.rssrc/main.rs 里有没有写测试函数。我曾经犯过一个低级错误:测试函数写在了 main.rs 里,但忘了加 #[cfg(test)] 模块,结果测试一直没跑起来。

2.4 依赖管理与 crates.io

Rust 的依赖管理,说白了就是去 crates.io 上找别人写好的库,然后加到你的 Cargo.toml 里。

举个例子,假设你想用 serde 这个库来做 JSON 序列化。打开 Cargo.toml,在 [dependencies] 下面加一行:

[dependencies]
serde = "1.0"

然后运行 cargo build,Cargo 会自动下载 serde 及其依赖。就是这么简单。

版本号怎么写?有三种常见方式:

写法 含义 示例
"1.0" 兼容 1.0 及以上,但小于 2.0 的任何版本 会匹配 1.0.0、1.1.0、1.9.9 等
"^1.0" "1.0" 相同,是默认行为 同上
"=1.0.0" 精确匹配 1.0.0,不升级 只使用 1.0.0
">=1.0, <2.0" 自定义范围 1.0 到 2.0 之间

我个人建议,刚开始用 "1.0" 这种宽松写法就够了。等项目稳定了,再考虑锁定版本。

还有一个好用的命令:cargo search。比如你想找处理日期的库:

cargo search chrono

它会返回 crates.io 上相关的包名和描述。嗯,这个命令我经常用,比去网页上搜快多了。

避坑指南: 我曾经在 Cargo.toml 里写了一个不存在的版本号,比如 serde = "2.0"(当时 serde 还没出 2.0),结果 cargo build 报错说找不到。后来我学乖了,每次加依赖前先用 cargo search 确认一下最新版本。

2.5 知识体系图

下面这张图帮你理清 Cargo 的核心逻辑:

Cargo 项目管理 cargo new cargo build / run / check / test 依赖管理 & crates.io Cargo.toml 详解 Cargo 是 Rust 的瑞士军刀 创建、编译、测试、依赖管理一站式搞定

这张图展示了 Cargo 的核心功能:创建项目、编译运行、依赖管理,以及它们都离不开的 Cargo.toml 配置文件。说白了,你只要掌握了这四个方面,Rust 的项目管理就基本拿下了。

2.6 实战小练习

光看不练可不行。我建议你现在就打开终端,按下面的步骤走一遍:

  1. cargo new hello_cargo 创建项目
  2. 用文本编辑器打开 Cargo.toml,看看里面有什么
  3. [dependencies] 下加一行 rand = "0.8"(一个随机数库)
  4. 运行 cargo build,观察它下载依赖的过程
  5. 运行 cargo run,看看程序能不能跑起来
  6. 试试 cargo check,感受一下它比 cargo build 快多少

嗯,做完这些,你对 Cargo 的基本操作就有手感了。以后写 Rust 项目,这些命令会像呼吸一样自然。


专注资料整理