Cargo 存在的原因

预备知识

正如您可能知道的那样,在 Rust 中,库或可执行程序被称为crate。Crate 使用 Rust 编译器 rustc 进行编译。当开始使用 Rust 时,大多数人遇到的第一个源代码是经典的“hello world”程序,他们通过直接调用 rustc 来编译它。

$ rustc hello.rs
$ ./hello
Hello, world!

请注意,上面的命令需要您显式指定文件名。如果您直接使用 rustc 编译不同的程序,则需要不同的命令行调用。如果您需要指定任何特定的编译器标志或包含外部依赖项,则所需的命令将更加具体(和复杂)。

此外,大多数非平凡的程序都可能依赖于外部库,因此也会传递性地依赖于它们的依赖项。手动获取所有必需依赖项的正确版本并保持它们是最新的,将会很困难并且容易出错。

与其仅使用 crate 和 rustc,不如通过引入更高级别的抽象概念,并使用包管理器,来避免执行上述任务时遇到的困难。

隆重推出:Cargo

Cargo 是 Rust 的包管理器。它是一个工具,允许 Rust 声明其各种依赖项,并确保您始终获得可重复的构建。

为了实现这个目标,Cargo 完成了四件事:

  • 引入两个包含各种包信息的元数据文件。
  • 获取并构建您的包的依赖项。
  • 使用正确的参数调用 rustc 或其他构建工具来构建您的包。
  • 引入约定,使处理 Rust 包更容易。

在很大程度上,Cargo 规范了构建给定程序或库所需的命令;这是上述约定的一个方面。正如我们稍后将展示的那样,可以使用相同的命令来构建不同的制品,而不管它们的名称如何。您可以调用诸如 cargo build 之类的通用命令,让 cargo 负责构建正确的 rustc 调用,而不是直接调用 rustc。此外,Cargo 将自动从注册表中获取您为制品定义的任何依赖项,并安排在需要时将它们添加到您的构建中。

毫不夸张地说,一旦你知道如何构建一个基于 Cargo 的项目,你就知道如何构建所有项目。