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 的项目,您就知道如何构建所有项目,这种说法只是稍微有点夸张。