词汇表
构件
一个 构件 是编译过程产生的文件或文件集。这包括可链接的库、可执行二进制文件以及生成的文档。
Cargo
Cargo 是 Rust 的 包管理器,也是本书主要讨论的主题。
Cargo.lock
参见 lock 文件。
Cargo.toml
参见 清单。
Crate
Rust 的一个 crate 是一个库或一个可执行程序,分别称为 库 crate 或 二进制 crate。
为 Cargo 包 定义的每个 目标 都是一个 crate。
广义上讲,术语 crate 可以指目标源代码,也可以指目标生成的编译构件。它还可以指从 注册表 获取的压缩包。
给定 crate 的源代码可以细分为 模块。
版本
Rust 版本 是 Rust 语言的一个开发里程碑。包的版本 在 Cargo.toml 清单 中指定,并且单独的目标可以指定它们使用的版本。有关更多信息,请参阅 版本指南。
特性
特性 的含义取决于上下文:
-
一个 特性 是一个命名标志,它允许条件编译。特性可以指可选依赖,也可以指在
Cargo.toml清单 中定义的、可以在源代码中检查的任意名称。 -
Cargo 具有 不稳定特性标志,可用于启用 Cargo 本身的实验性行为。
-
Rust 编译器和 Rustdoc 有它们自己的不稳定特性标志(参见 《不稳定手册》 和 《Rustdoc 手册》)。
-
CPU 目标具有 目标特性,用于指定 CPU 的能力。
索引
Lock 文件
Cargo.lock lock 文件 是一个文件,它记录了 工作区 或 包 中使用的每个依赖项的确切版本。它由 Cargo 自动生成。参见 Cargo.toml 与 Cargo.lock 的区别。
清单
一个 清单 是在名为 Cargo.toml 的文件中描述 包 或 工作区 的信息。
一个 虚拟清单 是一个 Cargo.toml 文件,它只描述一个工作区,不包含任何包。
成员
模块
Rust 的模块系统用于将代码组织成称为 模块 的逻辑单元,这些模块在代码中提供隔离的命名空间。
给定 crate 的源代码可以细分为一个或多个单独的模块。这通常是为了按相关功能领域组织代码,或控制源代码中符号(结构体、函数等)的可见范围(公共/私有)。
一个 Cargo.toml 文件主要关注其定义的 包、其 crate,以及这些 crate 依赖的包。然而,在使用 Rust 时,您会经常看到“模块”这个术语,因此您应该理解它与给定 crate 的关系。
包
一个 包 是源代码文件和一个描述包的 Cargo.toml 清单 文件的集合。包具有名称和版本,用于指定包之间的依赖关系。
一个包包含多个 目标,每个目标都是一个 crate。Cargo.toml 文件描述了包内 crate 的类型(二进制或库),以及关于每个 crate 的一些元数据——如何构建、直接依赖项是什么等等,正如本书中描述的那样。
包根目录 是包的 Cargo.toml 清单文件所在的目录。(与 工作区根目录 对比。)
一个 包 ID 规范,简称 SPEC,是一个字符串,用于唯一引用来自特定来源的特定版本的包。
中小型 Rust 项目通常只需要一个包,尽管它们通常会有多个 crate。
大型项目可能涉及多个包,在这种情况下,可以使用 Cargo 工作区 来管理包之间的公共依赖项和其他相关元数据。
包管理器
广义上讲,包管理器 是软件生态系统中的一个程序(或相关程序的集合),它自动化获取、安装和升级构件的过程。在编程语言生态系统中,包管理器是一个面向开发人员的工具,其主要功能是从某个中心仓库下载库构件及其依赖项;此功能通常与执行软件构建(通过调用特定语言的编译器)的能力相结合。
Cargo 是 Rust 生态系统中的包管理器。Cargo 下载您的 Rust 包 的依赖项(称为 crate 的 构件),编译您的包,制作可分发的包,并(可选地)将它们上传到 crates.io,即 Rust 社区的 包注册表。
包注册表
参见 注册表。
项目
包 的另一个名称。
注册表
一个 注册表 是一个服务,其中包含可供下载的 crate 集合,这些 crate 可以被安装或用作 包 的依赖项。Rust 生态系统中的默认注册表是 crates.io。注册表有一个 索引,其中包含所有 crate 的列表,并告诉 Cargo 如何下载所需的 crate。
源
一个 源 是一个提供者,它包含可能作为 包 的依赖项包含的 crate。有几种类型的源:
- 注册表源 — 参见 注册表。
- 本地注册表源 — 一组以压缩文件形式存储在文件系统上的 crate。参见 本地注册表源。
- 目录源 — 一组以未压缩文件形式存储在文件系统上的 crate。参见 目录源。
- 路径源 — 位于文件系统上的单个包(例如 路径依赖)或多个包的集合(例如 路径覆盖)。
- Git 源 — 位于 git 仓库中的包(例如 git 依赖 或 git 源)。
有关更多信息,请参阅 源替换。
规范
参见 包 ID 规范。
目标
目标 的含义取决于上下文:
-
Cargo 目标 — Cargo 包 由 目标 组成,这些目标对应于将生成的 构件。包可以有库、二进制、示例、测试和基准测试目标。目标列表 在
Cargo.toml清单 中配置,通常根据源代码文件的 目录布局 自动推断。 -
目标目录 — Cargo 将所有构建的构件和中间文件放在 目标 目录中。默认情况下,这是 工作区 根目录下的一个名为
target的目录,如果未使用工作区,则为包根目录。可以使用--target-dir命令行选项、CARGO_TARGET_DIR环境变量 或build.target-dir配置选项 更改该目录。 -
目标架构 — 构建构件的操作系统和机器架构通常被称为 目标。
-
目标三元组 — 三元组是指定目标架构的特定格式。三元组可以称为 目标三元组,它是生成的构件的架构,以及 主机三元组,它是编译器运行所在的架构。目标三元组可以使用
--target命令行选项或build.target配置选项 指定。三元组的一般格式是<arch><sub>-<vendor>-<sys>-<abi>,其中:arch= 基础 CPU 架构,例如x86_64,i686,arm,thumb,mips等。sub= CPU 子架构,例如arm有v7,v7s,v5te等。vendor= 供应商,例如unknown,apple,pc,nvidia等。sys= 系统名称,例如linux,windows,darwin等。none通常用于没有操作系统的裸机。abi= ABI,例如gnu,android,eabi等。
某些参数可以省略。运行
rustc --print target-list查看支持的目标列表。
测试目标
Cargo 测试目标 生成有助于验证代码正常运行和正确性的二进制文件。有两种类型的测试构件:
- 单元测试 — 单元测试 是直接从库或二进制目标编译的可执行二进制文件。它包含库或二进制代码的全部内容,并运行带有
#[test]标注的函数,旨在验证代码的单个单元。 - 集成测试目标 — 集成测试目标 是从 测试目标 编译的可执行二进制文件,测试目标是一个独立的 crate,其源代码位于
tests目录中或由Cargo.toml清单 中的[[test]]表 指定。它旨在只测试库的公共 API,或执行二进制文件以验证其操作。
工作区
一个 工作区 是一个或多个 包 的集合,这些包共享共同的依赖解析(使用共享的 Cargo.lock lock 文件)、输出目录以及各种设置(例如 profile)。
一个 虚拟工作区 是一个工作区,其根目录下的 Cargo.toml 清单 不定义包,只列出工作区 成员。
工作区根目录 是工作区的 Cargo.toml 清单文件所在的目录。(与 包根目录 对比。)