Cargo:Rust 的构建和包管理器

RustRustBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

欢迎来到你好,Cargo实验。本实验是《Rust 程序设计语言》的一部分。你可以在 LabEx 中练习你的 Rust 技能。

在本实验中,我们将了解 Cargo,它是 Rust 的构建系统和包管理器,可简化 Rust 项目的代码构建、依赖管理和库下载等任务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") subgraph Lab Skills rust/function_syntax -.-> lab-100385{{"Cargo:Rust 的构建和包管理器"}} rust/expressions_statements -.-> lab-100385{{"Cargo:Rust 的构建和包管理器"}} end

你好,Cargo

Cargo 是 Rust 的构建系统和包管理器。大多数 Rust 开发者使用这个工具来管理他们的 Rust 项目,因为 Cargo 会为你处理很多任务,比如构建你的代码、下载你的代码所依赖的库以及构建这些库。(我们把你的代码需要的库称为依赖项。)

像我们目前编写的最简单的 Rust 程序没有任何依赖项。如果我们用 Cargo 来构建“你好,世界!”项目,它只会使用 Cargo 中处理构建代码的部分。当你编写更复杂的 Rust 程序时,你会添加依赖项,如果你使用 Cargo 来启动一个项目,添加依赖项会容易得多。

因为绝大多数 Rust 项目都使用 Cargo,所以本书的其余部分假定你也在使用 Cargo。如果你使用了“安装”中讨论的官方安装程序,Cargo 会随 Rust 一起安装。如果你通过其他方式安装了 Rust,可以在终端中输入以下内容来检查是否安装了 Cargo:

cargo --version

如果你看到一个版本号,那就说明你已经安装好了!如果你看到一个错误,比如“command not found”,请查看你的安装方法的文档,以确定如何单独安装 Cargo。

使用 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的内容

此文件采用TOMLTom'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 项目

现在让我们看看使用 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 checkcargo build快得多,因为它跳过了生成可执行文件的步骤。如果你在编写代码时不断检查工作,使用cargo check会加快让你知道项目是否仍能编译的过程!因此,许多 Rust 开发者在编写程序时会定期运行cargo check以确保它能编译。然后当他们准备好使用可执行文件时,再运行cargo build

让我们回顾一下到目前为止我们学到的关于 Cargo 的知识:

  • 我们可以使用cargo new创建一个项目。
  • 我们可以使用cargo build构建一个项目。
  • 我们可以使用cargo run在一步中构建并运行一个项目。
  • 我们可以使用cargo check构建一个项目而不生成二进制文件来检查错误。
  • Cargo 不是将构建结果保存在与我们代码相同的目录中,而是将其存储在target/debug目录中。

使用 Cargo 的另一个优点是,无论你在哪个操作系统上工作,命令都是相同的。所以,从现在起,我们将不再针对 Linux、macOS 和 Windows 提供具体的操作说明。

发布版本构建

当你的项目最终准备好发布时,可以使用cargo build --release来进行优化编译。

cargo build --release

此命令会在target/release目录中创建一个可执行文件,而不是在target/debug目录。优化会使你的 Rust 代码运行得更快,但开启优化会延长程序的编译时间。这就是为什么有两种不同的配置文件:一种用于开发,此时你希望快速且频繁地重新构建;另一种用于构建最终提供给用户的程序,该程序不会被反复重新构建,并且会尽可能快地运行。如果你正在对代码的运行时间进行基准测试,请务必运行cargo build --release并使用target/release目录中的可执行文件进行基准测试。

约定俗成的 Cargo

对于简单的项目,与仅使用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 中练习更多实验来提升你的技能。