第72章 附录:术语表
Artifact
Artifact(构建产物)指编译过程生成的文件或文件集合。这包括可链接的库、可执行二进制文件以及生成的文档。
Cargo
Cargo 是 Rust 的包管理器,也是本书的主要主题。
Cargo.lock
参见锁文件。
Cargo.toml
参见清单文件。
Crate
Rust 的 crate(代码包)要么是库,要么是可执行程序,分别称为库 crate或二进制 crate。
Cargo package(包)中定义的每个target(目标)都是一个crate。
宽泛地说,crate 一词可以指目标的源代码,也可以指目标生成的编译产物。它还可以指从registry(注册表)获取的压缩包。
特定 crate 的源代码可以划分为modules(模块)。
Edition
Rust edition(版本)是 Rust 语言发展过程中的里程碑。包的版本在Cargo.tomlmanifest(清单文件)中指定,各个目标可以指定其使用的版本。更多信息请参见Edition Guide。
Feature
feature(特性)的含义取决于上下文:
-
feature 是一个命名列标志,用于实现条件编译。特性可以指可选依赖项,也可以指在
Cargo.tomlmanifest中定义的任意名称,这些名称可以在源代码中进行检查。 -
Cargo 拥有unstable feature flags(不稳定特性标志),可用于启用 Cargo 本身的实验性功能。
-
Rust 编译器和 Rustdoc 各自拥有自己的不稳定特性标志(参见The Unstable Book和The Rustdoc Book)。
-
CPU 目标具有target features(目标特性),用于指定 CPU 的能力。
索引
索引是crates(crate)的可搜索列表,位于某个registry(注册表)中。
锁定文件
Cargo.lock 锁定文件用于记录在workspace(工作区)或package(包)中使用的每个依赖项的确切版本。该文件由 Cargo 自动生成。参见Cargo.toml 与 Cargo.lock。
清单文件
清单文件是名为 Cargo.toml 的文件,用于描述一个包或一个工作区。
虚拟清单文件是一个仅描述工作区而不包含包的 Cargo.toml 文件。
成员
模块
Rust 的模块系统用于将代码组织成称为模块的逻辑单元,它们在代码内部提供隔离的命名空间。
给定crate的源代码可以细分为一个或多个独立模块。这通常是为了将代码组织为相关功能区域,或控制符号在源代码内的可见作用域(公共/私有)。
Cargo.toml文件主要关注其所定义的包、其 crate 以及这些 crate 所依赖的包。尽管如此,在使用 Rust 时你经常会遇到“模块”一词,因此应当理解它与特定 crate 的关系。
包
包是一组源文件和一个描述该包的 Cargo.toml 清单文件。包具有名称和版本,用于指定包之间的依赖关系。
一个 package(包)包含多个 target(目标),每个 target 都是一个 crate。Cargo.toml 文件描述了包内各 crate 的类型(二进制或库),以及它们各自的元数据,比如如何构建、直接依赖有哪些等,具体内容贯穿全书有所介绍。
package root(包根目录)指包的 Cargo.toml 清单文件所在的目录。(对照 workspace root(工作区根目录)。)
package ID specification(包 ID 规范),简称 SPEC,是一个字符串,用于唯一引用来自特定来源的某个特定版本的包。
中小型 Rust 项目通常只需要一个包,但包含多个 crate 的情况很常见。
较大的项目可能包含多个包,这时可以使用 Cargo 的 workspace(工作区) 来管理包之间的公共依赖及其他相关元数据。
Package manager(包管理器)
广义上讲,package manager(包管理器)是软件生态中用于自动化获取、安装和升级制品的程序(或一组相关程序)。在编程语言生态中,包管理器是一种面向开发者的工具,其主要功能是从中央仓库下载库制品及其依赖;这一功能通常还与执行软件构建的能力(通过调用对应语言的编译器)结合在一起。
Cargo 是 Rust 生态的包管理器。它会下载你的 Rust package 的依赖(即被称为 crate 的 artifact(制品)),编译你的包,制作可分发的包,并(可选地)将它们上传到 crates.io——Rust 社区的 package registry(包注册中心)。
Package registry(包注册中心)
参见 registry(注册中心)。
Project(项目)
package(包)的另一种叫法。
Registry(注册中心)
注册表(registry)是存放可下载 crate 集合的服务,这些 crate 可以作为 软件包(package)安装或被用作依赖项。Rust 生态中的默认注册表是 crates.io。注册表包含一个 索引(index),列出所有 crate,并告知 Cargo 如何下载所需的 crate。
来源
来源(source)是提供 crate 的载体,这些 crate 可以作为 软件包 的依赖项引入。来源有以下几种类型:
- 注册表来源 — 参见 注册表。
- 本地注册表来源 — 以压缩文件形式存储在文件系统上的一组 crate。参见 本地注册表来源。
- 目录来源 — 以未压缩文件形式存储在文件系统上的一组 crate。参见 目录来源。
- 路径来源 — 位于文件系统上的单个软件包(例如 路径依赖)或多个软件包(例如 路径覆盖)。
- Git 来源 — 位于 Git 仓库中的软件包(例如 Git 依赖 或 Git 来源替换)。
更多信息请参见 来源替换。
规范
参见 软件包 ID 规范。
目标
术语 目标(target)的含义取决于上下文:
-
Cargo 目标 — Cargo 软件包 由若干目标组成,每个目标对应将生成的 工件。软件包可以包含库、二进制文件、示例、测试和基准测试目标。目标列表在
Cargo.toml清单文件中配置,通常由源文件的目录布局自动推断得出。 -
目标目录(Target Directory) — Cargo 将构建产物放置在 target 目录中。 默认情况下,这是位于 工作区 根目录下的
target目录; 若未使用工作区,则为包根目录。可通过命令行选项--target-dir、环境变量CARGO_TARGET_DIR或 配置项build.target-dir更改此目录。 更多信息请参阅 构建缓存 文档。 -
目标架构(Target Architecture) — 构建产物所针对的操作系统和机器架构通常被称为 目标。
-
目标三元组(Target Triple) — 三元组是指定目标架构的特定格式。三元组通常被称为 目标三元组,指代生成的构件的架构; 而 宿主三元组 则指代编译器运行所在的架构。可通过命令行选项
--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 测试目标 会生成用于验证代码正确性和适当操作的二进制文件。测试产物分为两种类型:
- 单元测试(Unit test)——单元测试是由 library 或 binary 目标直接编译得到的可执行文件。它包含该 library 或 binary 代码的全部内容,运行带有
#[test]标注的函数,用于验证代码中的各个独立单元。 - 集成测试目标(Integration test target)——集成测试目标是由测试目标编译得到的可执行文件。测试目标是一个独立的 crate,其源码位于
tests目录,或在Cargo.tomlmanifest 中通过[[test]]表指定。它只用于测试 library 的公开 API,或执行 binary 以验证其运行是否正常。
Workspace
workspace 是一个或多个 package 的集合,这些 package 共享同一套依赖解析结果(即共享 Cargo.lock lock file)、同一个输出目录,以及 profile 等各种设置。
虚拟 workspace 是指根目录的 Cargo.toml manifest 不定义任何 package,只在 workspace 的 members 中列出成员的 workspace。
workspace 根目录是指 workspace 的 Cargo.toml manifest 所在的目录。(与 package 根目录对比。)