为何有Cargo

初识

在 Rust 中,一个类库或可执行程序称为一个 crate 。 使用 Rust 编译器 rustc 编译 Crate 。 刚开始学习 Rust 时,经典的 "hello world" 程序,可以通过 rustc 直接编译:

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

请注意,上面的命令需要显式指定文件名。 如果直接使用 rustc 编译不同的程序,不同的文件就需要执行不同的命令。 如果需要指定编译选项或包含的外部依赖,就需要十分具体详尽的执行命令。

而且,大多数程序会有额外的外部依赖,这些外部依赖又会有其他依赖。 此时手动维护必要依赖的正确版本,并协调依赖版本更新会很困难。

相较于直接跟 crate 和 rustc 打交道,引入了更高层 "包(package)" 的抽象。 并使用 包管理器 来避免这些手动的乏味工作。

走进 Cargo

Cargo 是 Rust 的包管理器。它是工具,允许 Rust packages 声明其各种依赖关系,确保总是能得到一个可重复的构建。

Cargo 做了以下四件事来实现这个目标:

  • 引进两个文件,包含包的各类元数据信息。
  • 下载并构建包的依赖。
  • 调用 rustc 或其他构建工具及正确的参数来构建包。
  • 引进规范使 Rust 包的操作更简单。

Cargo 在很大程度的标准化了构建程序或包的命令,这是上述规范的一个方面。 从下文中可以看到,相同的命令可以构建名称不同的 artifacts "制品"。 相比直接调用 rustc ,可以调用 cargo build 等更加通用的命令,而让 cargo 正确的调用 rustc 去构建。 并且,Cargo 可以自动从 registry "注册中心"下载依赖,并将依赖合并到构建中。

夸张一点说,一旦你学会使用 Cargo 就可以构建 所有 项目。