您好,Cargo!
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 使用此工具
来管理他们的 Rust 项目,因为 Cargo 会为你处理很多任务,
例如构建代码、下载代码所依赖的库,以及
构建这些库。(我们将代码所需的库称为
依赖项。
最简单的 Rust 程序,比如我们目前编写的程序,没有任何依赖项。如果我们用 Cargo 构建了 “Hello, world!” 项目,它只会使用 Cargo 中处理构建代码的部分。当你编写更复杂的 Rust 程序时,你会添加依赖项,如果你使用 Cargo 启动一个项目,添加依赖项会容易得多。
因为绝大多数 Rust 项目都使用 Cargo,所以本书的其余部分
假设你也在使用 Cargo。Cargo 随 Rust 一起安装,如果你
使用了
“安装”部分。如果您通过其他方式安装了 Rust,请在您的终端中输入以下内容来检查是否已安装 Cargo:
$ cargo --版本
如果您看到版本号,则表示您拥有它!如果您看到错误,例如 command not found
,请查看您的安装方法的文档,以确定如何单独安装 Cargo。
使用 Cargo 创建项目
让我们使用 Cargo 创建一个新项目,看看它与原来的 “Hello, world!” 项目有何不同。导航回 projects 目录(或您决定存储代码的任何位置)。然后,在任何作系统上运行以下命令:
$ cargo new hello_cargo
$ cd hello_cargo
第一个命令将创建一个名为 hello_cargo 的新目录和项目。我们将项目命名为 hello_cargo,Cargo 在同名目录中创建其文件。
进入 hello_cargo 目录并列出文件。你会看到 Cargo 为我们生成了两个文件和一个目录:一个 Cargo.toml 文件和一个
src 目录中,其中包含一个 main.rs 文件。
它还初始化了一个新的 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"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
示例 1-2:
cargo new
生成的 Cargo.toml 内容
此文件位于 TOML (Tom's Obvious, Minimal
Language) 格式,这是 Cargo 的配置格式。
第一行 [package]
是一个章节标题,指示以下语句正在配置一个包。当我们向此文件添加更多信息时,我们将添加其他部分。
接下来的三行设置了 Cargo 编译程序所需的配置信息:名称、版本和要使用的 Rust 版本。我们将在附录 E 中讨论版本
键。
最后一行 [dependencies]
是部分的开头,供您列出任何
的项目依赖项。在 Rust 中,代码包称为
板条箱。这个项目不需要任何其他 crate,但是在第 2 章的第一个项目中,我们将使用这个 dependencies 部分。
现在打开 src/main.rs 并查看:
文件名: src/main.rs
fn main() { println!("Hello, world!"); }
Cargo 为你生成了一个 “Hello, world!” 程序,就像我们在示例 1-1 中写的那个一样!到目前为止,我们的项目和 Cargo 生成的项目的不同之处在于,Cargo 将代码放在了 src 目录下,而我们在顶层目录下有一个 Cargo.toml 配置文件。
Cargo 期望你的源文件位于 src 目录中。顶级项目目录仅用于 README 文件、许可证信息、配置文件以及与代码无关的任何其他内容。使用 Cargo 可以帮助你组织项目。万物皆有其一席之地,而一切都在其位置上。
如果您启动了一个不使用 Cargo 的项目,就像我们对 “Hello, world!” 项目所做的那样,您可以将其转换为使用 Cargo 的项目。将项目代码移动到 src 目录下,并创建一个合适的 Cargo.toml
文件。获取 Cargo.toml 文件的一种简单方法是运行 cargo init
,它会自动为你创建它。
构建和运行 Cargo 项目
现在让我们看看当我们使用 Cargo 构建和运行 “Hello, world!” 程序时有什么不同!在 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 中创建可执行文件(或
target\debug\hello_cargo.exe)而不是当前目录中。因为默认构建是 debug 构建,所以 Cargo 将二进制文件放在名为 debug 的目录中。您可以使用以下命令运行可执行文件:
$ ./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows
Hello, world!
如果一切顺利,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 build
的 build 的 Git,因为它跳过了生成可执行文件的步骤。如果你在编写代码时不断检查你的工作,使用 cargo check
将加快让你知道你的项目是否仍在编译的过程!因此,许多 Rustacean 在编写程序时会定期运行 cargo check
,以确保它能够编译。然后,当他们准备好使用可执行文件时,他们运行 cargo build
。
让我们回顾一下到目前为止我们对 Cargo 的了解:
我们可以使用cargo new
创建一个项目。
我们可以使用cargo build
构建一个项目。
我们可以使用cargo run
一步构建和运行一个项目。
我们可以构建一个项目,而无需生成二进制文件来检查错误货物检查
。
Cargo 没有将构建结果保存在与我们的代码相同的目录中,而是将其存储在 target/debug 目录中。
使用 Cargo 的另一个优点是,无论你在哪个作系统上工作,命令都是相同的。因此,在这一点上,我们将不再提供 Linux 和 macOS 与 Windows 的具体说明。
为发布而构建
当您的项目最终准备好发布时,您可以使用 cargo build --release
对其进行优化编译。此命令将在 target/release 而不是 target/debug 中创建可执行文件。优化使您的 Rust 代码运行得更快,但打开它们会延长程序编译所需的时间。这就是为什么有两种不同的配置文件:一种用于开发,当您想要快速且频繁地重新构建时,另一种用于构建您将提供给用户的最终程序,该程序不会重复重新构建,并且会尽可能快地运行。如果要对代码的运行时间进行基准测试,请务必运行 cargo build --release
并使用 target/release 中的可执行文件进行基准测试。
Cargo as Convention
对于简单的项目,Cargo 并不能提供很多价值,而不仅仅是使用
rustc 的 rustc
中,但随着您的程序变得更加复杂,它将证明它的价值。一旦程序增长到多个文件或需要一个依赖项,让 Cargo 协调构建就会容易得多。
尽管 hello_cargo
项目很简单,但它现在使用了您将在 Rust 职业生涯的其余部分中使用的许多实际工具。事实上,要处理任何现有项目,您可以使用以下命令通过 Git 签出代码,切换到该项目的目录,然后构建:
$ git clone example.org/someproject
$ cd someproject
$ cargo build
有关 Cargo 的更多信息,请查看其文档。
总结
您的 Rust 之旅已经有一个良好的开端!在本章中,您学习了如何:
使用rustup
安装最新稳定版本的 Rust
更新到较新的 Rust 版本
打开本地安装的文档
直接使用rustc
编写并运行一个 “Hello, world!” 程序
使用 Cargo 的约定创建并运行一个新项目
这是构建更实质性的程序以习惯读取和编写 Rust 代码的好时机。因此,在第 2 章中,我们将构建一个猜谜游戏程序。如果你更愿意从学习 Rust 中常见的编程概念如何开始,请参阅第 3 章,然后返回第 2 章。