Skip to content

Rust - 包管理器

Cargo 是 Rust 官方的构建工具和包管理器。它处理广泛的任务,使 Rust 开发变得流线型且专业。Cargo 是你用于构建、测试和管理项目依赖项的主要接口。

命令描述
cargo new <name>在名为 <name> 的目录中创建一个新的二进制(可执行)Rust 项目。
cargo new <name> --lib创建一个新的库(可共享代码)Rust 项目。
cargo run编译并运行你的二进制包。
cargo build编译当前项目而不运行。
cargo build --release编译项目时启用性能优化。
cargo check快速检查代码错误,不生成可执行文件,比完整构建快得多。
cargo test运行项目中的所有测试。
cargo fmt根据 Rust 官方样式指南自动格式化代码。
cargo clippy一个强大的 Linter,可以捕获常见错误并提出代码改进建议。
cargo update根据 Cargo.toml 将依赖项更新到允许的最新版本。
cargo clean删除包含所有构建产物的 target 目录。

让我们构建一个经典的数字猜谜游戏。这个项目将演示如何创建新项目、添加外部依赖项以及编写现代、惯用的 Rust 代码。

步骤 1:创建一个新的 Cargo 项目

Section titled “步骤 1:创建一个新的 Cargo 项目”

打开你的终端并运行:

cargo new guessing_game

Cargo 为你生成一个标准的项目结构:

guessing_game/
├── Cargo.toml
└── src/
└── main.rs
  • Cargo.toml:清单文件。它包含项目元数据和依赖项列表。
  • src/main.rs:你的主应用程序二进制的源代码。

我们需要生成一个随机数。Rust 标准库不包含随机数生成器,但我们可以轻松地从 crates.io(Rust 官方包注册表)添加一个。最受欢迎的包是 rand。

打开你的 Cargo.toml 文件,并在 [dependencies] 部分下添加 rand。你可以在 crates.io 上找到最新版本。

[package]
name = "guessing_game"
version = "0.1.0"
edition = "2021" # 确保你使用的是现代 Rust 版本
[dependencies]
rand = "0.8" # 使用 rand 包的最新版本

现在,将 src/main.rs 的内容替换为游戏逻辑。此代码演示了如何导入包、处理用户输入、解析字符串以及使用 loop 结合 match 进行控制流。

use std::io;
use std::cmp::Ordering;
use rand::Rng; // 从 rand 包导入 Rng 特性
fn main() {
println!("Guess the number!");
// 生成一个介于 1 到 100 之间的秘密数字
let secret_number = rand::thread_rng().gen_range(1..=100);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
// 将字符串转换为数字,并处理无效输入
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("Please type a number!");
continue; // 跳到下一次循环迭代
}
};
println!("You guessed: {}", guess);
// 比较猜测与秘密数字
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break; // 退出循环
}
}
}
}

在终端中导航到你的项目目录(guessing_game)并运行:

cargo run

第一次运行此命令时,Cargo 将下载并编译 rand 及其依赖项。然后,它将编译并运行你的游戏。

首次构建后,你会注意到一个新文件:Cargo.lock。此文件记录了项目中使用的所有依赖项的精确版本。这确保了团队中的每个开发人员以及你的生产构建服务器都使用相同的依赖项版本,从而保证了可复现的构建。