Cargo 是 Rust 的包管理器。它随 Rust 一起预装,可用于打包依赖项,管理它们,以及构建和分发我们自己的包/库。
Rust 中 Cargo 的特性
Cargo 是一个用于 Rust 的命令行工具,具有以下特性
- 依赖管理
Cargo 使管理项目依赖项变得容易,包括添加、更新和删除依赖项。
- 构建和打包
Cargo 可以自动构建和打包我们的 Rust 项目,创建可以与他人共享的二进制或库代码。
- 文档生成
Cargo 可以自动为我们的代码生成文档,使其他开发人员更容易理解和使用我们的库。
- 下载 crate
Cargo 可以从 crates.io 下载和安装库,这是 Rust crate 的中央存储库。 - 运行二进制文件或测试
Cargo 可以构建我们的源代码,运行可执行二进制文件,还可以运行我们的测试。
Rust 中使用 Cargo 进行依赖管理
Cargo 的主要功能之一是它可以下载、管理外部库。
让我们来看一个如何使用来自 crates.io 的外部 crate 的示例。crates.io 是一个中央存储库,我们可以在其中拉取和发布 Rust 的共享库。
首先,使用 cargo 创建一个 Rust 项目
$ cargo new hello_world
现在,
- 我们项目目录
hello_world
的根目录下的Cargo.toml
文件用于管理依赖项。
如果我们想使用 "rand" crate,我们将以下行添加到 Cargo.toml
的 [dependencies]
部分。
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.net.cn/cargo/reference/manifest.html
[dependencies]
rand = "0.8.5"
注意:我们也可以使用命令 cargo add rand
将依赖项添加到我们的项目中。
- 接下来,我们需要在我们的
src/main.rs
Rust 文件中导入 crate。我们可以通过在文件顶部使用extern crate <crate_name>
行来实现。
extern crate rand;
- 现在,我们可以使用 "rand" crate 在 **1** 和 **6** 之间生成一个随机数。
use
关键字在这里用于将项(如函数、类型和常量)从 "rand" crate 导入到当前作用域。
extern crate rand;
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
// simulate rolling a die
println!("roll = {}", rng.gen_range(1..=6));
}
# Output: roll = 5
使用 Cargo 构建和运行 Rust 项目
我们可以使用 cargo 来安装、构建和运行我们的 hello_world
项目以及 "rand" crate。方法如下:
构建项目
$ cargo build
输出
Compiling libc v0.2.139 Compiling cfg-if v1.0.0 Compiling ppv-lite86 v0.2.17 Compiling getrandom v0.2.8 Compiling rand_core v0.6.4 Compiling rand_chacha v0.3.1 Compiling rand v0.8.5 Compiling hello_world v0.1.0 (/experiments/rust-practice/hello_world) Finished dev [unoptimized + debuginfo] target(s) in 2.57s
cargo build
命令首先安装 src/
目录中使用的所有 crate,然后继续编译项目。
运行项目
$ cargo run
输出
Finished dev [unoptimized + debuginfo] target(s) in 0.05s Running `target/debug/hello_world` roll = 5
Rust 中有用的 Cargo 命令
Cargo 可以为我们处理许多重复性任务。以下是一些常用的 cargo 命令。
命令 | 描述 |
---|---|
cargo new |
创建一个具有基本目录结构的新 Rust 项目 |
cargo build |
构建(编译)当前项目并生成一个二进制可执行文件 |
cargo run |
构建并运行你当前的项目 (cargo build + run) |
cargo check |
构建当前项目而不生成二进制可执行文件 |
cargo add |
添加一个新依赖项并将其包含在 Cargo.toml 文件中 |
cargo update |
将当前项目的所有依赖项更新到最新版本 |