Rush Stack商店博客活动
跳至主要内容

Heft 架构

先阅读 🎈

以下是 Heft 中最重要的概念的快速总结

操作

在 Heft 的术语中,"操作"是指命令行动词,正如 Rush Stack 的 ts-command-line 系统形式化的那样。使用 heft --help 查看可用的操作。cleanrun 操作由 Heft 本身提供;其他操作由您的 heft.json 配置生成。

示例: shell 命令 heft test --clean 正在调用 test 操作。

注意: Heft 的早期版本也使用“操作”来表示 heft.json 中的 eventActions。此术语不再使用。

参数

操作支持各种命令行“参数”以调整行为。一些参数由 Heft 本身定义;其他参数由 Heft 插件提供。

示例: shell 命令 heft test --clean 正在使用 --clean 参数。

任务

Heft “任务”在您的项目 heft.json 配置文件的 tasksByName 部分定义。任务通常读取输入文件和/或生成输出文件,通常通过调用熟悉的工具(如 TypeScript 或 ESLint)来完成。每个任务都加载一个 Heft 任务插件(见下文)。两个不同的任务可以加载同一个插件。任务可以互相依赖,这决定了它们的调度顺序。

示例: @rushstack/heft-web-rig 配置 定义 了一个名为 webpack 的任务。

阶段

“阶段”是 Heft 任务的排列,在您的项目 heft.json 配置文件的 phasesByName 部分定义。在该文件中,阶段被赋予名称,例如 buildtest。定义一个阶段会创建两个对应的命令行操作。例如,test 阶段会生成 heft testheft test-watch 操作。-watch 变体用于交互式监视模式,例如本地主机开发服务器。

如果任务属于同一阶段,它们可以共享内存对象以进行优化;否则,它们只能通过将文件写入磁盘来进行通信。此要求支持与 Rush 阶段 集成,这些阶段可能在不同时间或不同计算机上运行,通过 Rush 构建缓存进行通信。

示例: @rushstack/heft-web-rig 配置 定义 了一个 build 阶段,其中包含 webpack 任务。

插件

Heft 插件是实现 IHeftPlugin 合同的 TypeScript 类。有两种类型的插件

  • a 任务插件 可以由 heft.json 任务加载并提供其实现
  • a 生命周期插件 提供不特定于任何任务的通用功能;例如,收集计时指标

插件包

“插件包”是指提供 Heft 插件的 NPM 包。NPM 包的命名模式为 heft-____-pluginheft-____-plugins(根据插件的数量而定)。内置插件 直接从 @rushstack/heft 包中加载。

有关官方插件列表,请参阅 插件包索引

示例: @rushstack/heft-jest-plugin 包实现了 jest-plugin

插件清单

每个插件包都包含一个名为 heft-plug.json 的文件,称为“插件清单”。它描述了可用的插件、它们的选项以及它们的命令行参数。Heft 是数据驱动的,这意味着可以在不执行任何自定义脚本的情况下发现这些信息。(尽管脚本配置非常流行,但它有很多问题,例如意外的性能成本、难以预测的行为,这会阻碍缓存,并导致糟糕的错误消息。)

示例: @rushstack/heft-jest-plugin 包在 此清单 中声明了 jest-plugin

钩子

Heft 插件可以在构建生命周期的各种事件期间注册处理程序。术语“点击”事件“钩子”来自 Heft 对 tapable 系统的使用,该系统在 Webpack 插件中很常见。

示例: 在 Heft 的源代码中,IHeftTaskHooks 接口公开了一些钩子。

rig 包

Heft 的主要理念是将构建逻辑移到插件包中,以便您的构建过程由配置文件而不是程序脚本定义。在大型单体仓库中,这极大地降低了维护成本,因为它确保程序脚本被开发成专业软件,而不是 .js 文件中的临时命令。

Rush Stack rig 系统 迈出了一步,可以选择将配置文件移到一个名为“rig”的集中式 NPM 包中。rig 为您的项目定义了标准化配置。在大型单体仓库中,它们形式化了构建团队同意支持的配置。Heft 还允许从 rig 包中解析 devDependencies,减少 package.json 的混乱。

示例: @rushstack/heft-web-rig 是 Rush Stack 的 Web 项目参考 rig。

rig 配置文件

单个 rig 包可以提供针对特定目的量身定制的多个“配置文件”。rig 包中的配置文件共享相同的 rig devDependencies,并且也可以通过 "extends" 继承共享配置。

示例: @rushstack/heft-web-rig rig 包目前定义了 两个配置文件applibrary