软件包和板条箱

我们将介绍的模块系统的第一部分是 package 和 crate。

crate 是 Rust 编译器在 时间。即使您运行而不是传递单个源代码 文件(就像我们在 “编写和运行 Rust 程序” 中所做的那样 部分),编译器会将该文件视为 crate。箱子 可以包含模块,并且模块可以在其他获取 使用 crate 编译,我们将在后面的章节中看到。rustccargo

crate 可以有两种形式之一:二进制 crate 或库 crate。Binary crate 是你可以编译成可以运行的可执行文件的程序, 例如命令行程序或服务器。每个 Secret 都必须有一个 function called 来定义可执行文件运行时发生的情况。我们拥有的所有板条箱 到目前为止创建的是二进制 crate。main

库 crate 没有函数,它们不会编译为 可执行。相反,它们定义了要与之共享的功能 多个项目。例如,我们在 Chapter 中使用的 crate 2 提供生成随机数的功能。 大多数时候,当 Rustacean 说 “crate” 时,他们指的是库 crate,而他们 将 “crate” 与 “library” 的一般编程概念互换使用。mainrand

crate 根是 Rust 编译器从源文件开始并生成的 向上是 crate 的根模块(我们将在 “定义模块以控制范围和隐私” 一节中深入解释模块)。

软件包是一个或多个 crate 的捆绑包,它提供一组 功能性。包包含一个 Cargo.toml 文件,该文件描述了如何 建造那些板条箱。Cargo 实际上是一个包含二进制 crate 的包 对于您用于构建代码的命令行工具。货物 package 还包含 binary crate 所依赖的 library crate。其他 项目可以依赖 Cargo 库 crate 来使用与 Cargo 相同的逻辑 命令行工具使用。一个 package 可以包含任意数量的二进制 crate like,但最多只有一个 library crate。一个包必须至少包含一个 crate,无论是库还是二进制 crate。

让我们来看看创建 package 时会发生什么。首先,我们输入 命令:cargo new my-project

$ cargo new my-project
     Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs

运行 后,我们用于查看 Cargo 创建的内容。在 project 目录中,有一个 Cargo.toml 文件,为我们提供了一个包。 还有一个包含 main.rssrc 目录。在 中打开 Cargo.toml 您的文本编辑器,请注意,没有提到 src/main.rs。Cargo 遵循 约定 src/main.rs 是具有相同 name 作为包。同样,Cargo 知道如果 package 目录 包含 src/lib.rs,则软件包包含一个同名的库 crate 作为包,src/lib.rs 是它的 crate 根。货物通过 crate 根 文件来构建库或二进制文件。cargo new my-projectlsrustc

在这里,我们有一个只包含 src/main.rs 的包,这意味着它只包含 src/main.rs 包含名为 的二进制 crate。如果一个包包含 src/main.rssrc/lib.rs,它有两个 crate:一个 binary 和一个 library,它们具有相同的 name 作为包。一个包可以通过放置文件来拥有多个二进制 crate 在 src/bin 目录中:每个文件都将是一个单独的二进制 crate。my-project

本文档由官方文档翻译而来,如有差异请以官方英文文档(https://doc.rust-lang.org/)为准