软件包和板条箱
我们将介绍的模块系统的第一部分是 package 和 crate。
crate 是 Rust 编译器在
时间。即使你运行rustc
而不是cargo
并传递单个源代码
文件(就像我们在 “编写和运行 Rust 程序” 中所做的那样
部分),编译器会将该文件视为 crate。箱子
可以包含模块,并且模块可以在其他获取
使用 crate 编译,我们将在后面的章节中看到。
crate 可以有两种形式之一:二进制 crate 或库 crate。Binary crate 是你可以编译成可以运行的可执行文件的程序,
例如命令行程序或服务器。每个 API 都必须有一个名为main
定义可执行文件运行时会发生什么。我们拥有的所有板条箱
到目前为止创建的是二进制 crate。
库 crate 没有main
函数,并且它们不会编译为
可执行。相反,它们定义了要与之共享的功能
多个项目。例如,rand
我们在章节中使用的 crate
2 提供生成随机数的功能。
大多数时候,当 Rustacean 说 “crate” 时,他们指的是库 crate,而他们
将 “crate” 与 “library” 的一般编程概念互换使用。
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 new my-project
,我们使用ls
以查看 Cargo 创建的内容。在
project 目录中,有一个 Cargo.toml 文件,为我们提供了一个包。
还有一个包含 main.rs 的 src 目录。在 中打开 Cargo.toml
您的文本编辑器,请注意,没有提到 src/main.rs。Cargo 遵循
约定 src/main.rs 是具有相同
name 作为包。同样,Cargo 知道如果 package 目录
包含 src/lib.rs,则软件包包含一个同名的库 crate
作为包,src/lib.rs 是它的 crate 根。货物通过 crate 根
files 设置为rustc
构建库或二进制文件。
在这里,我们有一个只包含 src/main.rs 的包,这意味着它只包含 src/main.rs
包含一个名为my-project
.如果一个包包含 src/main.rs 和 src/lib.rs,它有两个 crate:一个 binary 和一个 library,它们具有相同的
name 作为包。一个包可以通过放置文件来拥有多个二进制 crate
在 src/bin 目录中:每个文件都将是一个单独的二进制 crate。
本文档由官方文档翻译而来,如有差异请以官方英文文档(https://doc.rust-lang.org/)为准