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 的项目,你就知道如何构建所有项目。