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"
我个人建议,从一开始就把 description 和 license 写上。为什么?因为如果你以后想把项目发布到 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 build 或 cargo run。这样能节省大量等待编译的时间。
cargo test
运行项目中的测试。Rust 的测试是写在代码里的,用 #[test] 标记。
cargo test
它会找到所有带 #[test] 的函数并执行。如果测试通过,你会看到绿色的 ok;如果失败,会显示具体哪一行出了问题。
cargo test 时遇到奇怪的错误,先检查一下 src/lib.rs 或 src/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.toml 配置文件。说白了,你只要掌握了这四个方面,Rust 的项目管理就基本拿下了。
2.6 实战小练习
光看不练可不行。我建议你现在就打开终端,按下面的步骤走一遍:
cargo new hello_cargo创建项目- 用文本编辑器打开
Cargo.toml,看看里面有什么 - 在
[dependencies]下加一行rand = "0.8"(一个随机数库) - 运行
cargo build,观察它下载依赖的过程 - 运行
cargo run,看看程序能不能跑起来 - 试试
cargo check,感受一下它比cargo build快多少
嗯,做完这些,你对 Cargo 的基本操作就有手感了。以后写 Rust 项目,这些命令会像呼吸一样自然。