Heft 架构
先阅读 🎈
以下是 Heft 中最重要的概念的快速总结
操作
在 Heft 的术语中,"操作"是指命令行动词,正如 Rush Stack 的 ts-command-line 系统形式化的那样。使用 heft --help
查看可用的操作。clean
和 run
操作由 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
部分定义。在该文件中,阶段被赋予名称,例如 build
或 test
。定义一个阶段会创建两个对应的命令行操作。例如,test
阶段会生成 heft test
和 heft test-watch
操作。-watch
变体用于交互式监视模式,例如本地主机开发服务器。
如果任务属于同一阶段,它们可以共享内存对象以进行优化;否则,它们只能通过将文件写入磁盘来进行通信。此要求支持与 Rush 阶段 集成,这些阶段可能在不同时间或不同计算机上运行,通过 Rush 构建缓存进行通信。
示例: @rushstack/heft-web-rig
配置 定义 了一个 build
阶段,其中包含 webpack
任务。
插件
Heft 插件是实现 IHeftPlugin
合同的 TypeScript 类。有两种类型的插件
- a 任务插件 可以由 heft.json 任务加载并提供其实现
- a 生命周期插件 提供不特定于任何任务的通用功能;例如,收集计时指标
插件包
“插件包”是指提供 Heft 插件的 NPM 包。NPM 包的命名模式为 heft-____-plugin
或 heft-____-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 包目前定义了 两个配置文件,app
和 library
。