简介
欢迎来到你好,Cargo实验。本实验是《Rust 程序设计语言》的一部分。你可以在 LabEx 中练习你的 Rust 技能。
在本实验中,我们将了解 Cargo,它是 Rust 的构建系统和包管理器,可简化 Rust 项目的代码构建、依赖管理和库下载等任务。
This tutorial is from open-source community. Access the source code
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
欢迎来到你好,Cargo实验。本实验是《Rust 程序设计语言》的一部分。你可以在 LabEx 中练习你的 Rust 技能。
在本实验中,我们将了解 Cargo,它是 Rust 的构建系统和包管理器,可简化 Rust 项目的代码构建、依赖管理和库下载等任务。
Cargo 是 Rust 的构建系统和包管理器。大多数 Rust 开发者使用这个工具来管理他们的 Rust 项目,因为 Cargo 会为你处理很多任务,比如构建你的代码、下载你的代码所依赖的库以及构建这些库。(我们把你的代码需要的库称为依赖项。)
像我们目前编写的最简单的 Rust 程序没有任何依赖项。如果我们用 Cargo 来构建“你好,世界!”项目,它只会使用 Cargo 中处理构建代码的部分。当你编写更复杂的 Rust 程序时,你会添加依赖项,如果你使用 Cargo 来启动一个项目,添加依赖项会容易得多。
因为绝大多数 Rust 项目都使用 Cargo,所以本书的其余部分假定你也在使用 Cargo。如果你使用了“安装”中讨论的官方安装程序,Cargo 会随 Rust 一起安装。如果你通过其他方式安装了 Rust,可以在终端中输入以下内容来检查是否安装了 Cargo:
cargo --version
如果你看到一个版本号,那就说明你已经安装好了!如果你看到一个错误,比如“command not found”,请查看你的安装方法的文档,以确定如何单独安装 Cargo。
让我们使用 Cargo 创建一个新项目,并看看它与我们最初的“你好,世界!”项目有何不同。导航回你的project
目录(或者你决定存储代码的任何地方)。然后,在任何操作系统上,运行以下命令:
cd ~/project
cargo new hello_cargo
cd hello_cargo
第一个命令创建了一个名为hello_cargo的新目录和项目。我们将项目命名为hello_cargo,Cargo 会在同名目录中创建其文件。
进入hello_cargo
目录并列出文件。你会看到 Cargo 为我们生成了两个文件和一个目录:一个Cargo.toml
文件以及一个包含main.rs
文件的src
目录。
它还初始化了一个新的 Git 仓库以及一个*.gitignore*文件。如果你在现有 Git 仓库中运行cargo new
,则不会生成 Git 文件;你可以使用cargo new --vcs=git
覆盖此行为。
注意:Git 是一种常见的版本控制系统。你可以通过使用
--vcs
标志来更改cargo new
以使用不同的版本控制系统或不使用版本控制系统。运行cargo new --help
以查看可用选项。
在你选择的文本编辑器中打开Cargo.toml
。它应该类似于清单 1-2 中的代码。
文件名:Cargo.toml
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
清单 1-2:cargo new
生成的Cargo.toml
的内容
此文件采用TOML(Tom's Obvious, Minimal Language)格式,这是 Cargo 的配置格式。
第一行[package]
是一个节标题,表示以下语句正在配置一个包。随着我们向此文件中添加更多信息,我们将添加其他节。
接下来的三行设置了 Cargo 编译你的程序所需的配置信息:名称、版本以及要使用的 Rust 版本。我们将在附录 E 中讨论edition
键。
最后一行[dependencies]
是一个节的开始,供你列出项目的任何依赖项。在 Rust 中,代码包被称为板条箱(crates)。这个项目我们不需要任何其他板条箱,但在第 2 章的第一个项目中我们会需要,所以到时候我们会使用这个依赖项部分。
现在打开src/main.rs
并看一看:
文件名:src/main.rs
fn main() {
println!("Hello, world!");
}
Cargo 为你生成了一个“你好,世界!”程序,就像我们在清单 1-1 中编写的一样!到目前为止,我们的项目与 Cargo 生成的项目之间的区别在于,Cargo 将代码放在了src
目录中,并且我们在顶级目录中有一个Cargo.toml
配置文件。
Cargo 期望你的源文件位于src
目录内。顶级项目目录仅用于 README 文件、许可信息、配置文件以及任何与你的代码无关的其他内容。使用 Cargo 有助于你组织项目。一切都有其位置,并且一切都在其应在的位置。
如果你启动了一个不使用 Cargo 的项目,就像我们对“你好,世界!”项目所做的那样,你可以将其转换为一个使用 Cargo 的项目。将项目代码移动到src
目录中,并创建一个合适的Cargo.toml
文件。
现在让我们看看使用 Cargo 构建和运行“你好,世界!”程序时有什么不同!在你的hello_cargo
目录中,通过输入以下命令来构建你的项目:
$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
此命令会在target/debug/hello_cargo
中创建一个可执行文件,而不是在当前目录中。因为默认构建是调试构建,所以 Cargo 将二进制文件放在名为debug
的目录中。你可以使用以下命令运行该可执行文件:
$./target/debug/hello_cargo
Hello, world!
如果一切顺利,“你好,世界!”应该会打印到终端。第一次运行cargo build
时,Cargo 还会在顶级目录创建一个新文件:Cargo.lock。此文件会记录项目中依赖项的确切版本。这个项目没有依赖项,所以该文件内容有点少。你永远不需要手动更改此文件;Cargo 会为你管理其内容。
我们刚刚使用cargo build
构建了一个项目,并使用./target/debug/hello_cargo
运行了它,但我们也可以使用cargo run
在一个命令中编译代码并运行生成的可执行文件:
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Hello, world!
使用cargo run
比必须记住先运行cargo build
然后再使用二进制文件的完整路径更方便,所以大多数开发者使用cargo run
。
注意,这次我们没有看到表明 Cargo 正在编译hello_cargo
的输出。Cargo 发现文件没有更改,所以它没有重新构建,只是运行了二进制文件。如果你修改了源代码,Cargo 会在运行之前重新构建项目,你会看到如下输出:
$ cargo run
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
Running `target/debug/hello_cargo`
Hello, world!
Cargo 还提供了一个名为cargo check
的命令。此命令会快速检查你的代码以确保它能编译,但不会生成可执行文件:
$ cargo check
Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
为什么你可能不想要一个可执行文件呢?通常,cargo check
比cargo build
快得多,因为它跳过了生成可执行文件的步骤。如果你在编写代码时不断检查工作,使用cargo check
会加快让你知道项目是否仍能编译的过程!因此,许多 Rust 开发者在编写程序时会定期运行cargo check
以确保它能编译。然后当他们准备好使用可执行文件时,再运行cargo build
。
让我们回顾一下到目前为止我们学到的关于 Cargo 的知识:
cargo new
创建一个项目。cargo build
构建一个项目。cargo run
在一步中构建并运行一个项目。cargo check
构建一个项目而不生成二进制文件来检查错误。target/debug
目录中。使用 Cargo 的另一个优点是,无论你在哪个操作系统上工作,命令都是相同的。所以,从现在起,我们将不再针对 Linux、macOS 和 Windows 提供具体的操作说明。
当你的项目最终准备好发布时,可以使用cargo build --release
来进行优化编译。
cargo build --release
此命令会在target/release
目录中创建一个可执行文件,而不是在target/debug
目录。优化会使你的 Rust 代码运行得更快,但开启优化会延长程序的编译时间。这就是为什么有两种不同的配置文件:一种用于开发,此时你希望快速且频繁地重新构建;另一种用于构建最终提供给用户的程序,该程序不会被反复重新构建,并且会尽可能快地运行。如果你正在对代码的运行时间进行基准测试,请务必运行cargo build --release
并使用target/release
目录中的可执行文件进行基准测试。
对于简单的项目,与仅使用rustc
相比,Cargo 并没有提供太多价值,但随着你的程序变得更加复杂,它将证明其价值。一旦程序发展到多个文件或需要依赖项,让 Cargo 来协调构建就会容易得多。
尽管hello_cargo
项目很简单,但它现在已经使用了你在 Rust 职业生涯中会用到的许多实际工具。实际上,要处理任何现有项目,你可以使用以下命令通过 Git 检出代码,切换到该项目的目录,然后进行构建:
git clone example.org/someproject
cd someproject
cargo build
有关 Cargo 的更多信息,请查看其文档:https://doc.rust-lang.org/cargo 。
恭喜你!你已经完成了“你好,Cargo”实验。你可以在 LabEx 中练习更多实验来提升你的技能。