Lerna 任务管道配置指南:用 nx.json 定义依赖、并行与缓存策略

发布时间:2026/9/19 15:20:58
Lerna 任务管道配置指南:用 nx.json 定义依赖、并行与缓存策略
Lerna 任务管道配置指南用 nx.json 定义依赖、并行与缓存策略【免费下载链接】lernaLerna is a fast, modern build system for managing and publishing multiple JavaScript/TypeScript packages from the same repository.项目地址: https://gitcode.com/gh_mirrors/le/lernaLerna 将 npm scripts 的执行包括进程调度委托给 Nx 的任务编排器而nx.json正是定义任务如何运行、以何种顺序运行、以多大并发度运行的核心配置文件。本文围绕 task-pipeline-configuration.md 展开讲解如何通过targetDefaults声明任务依赖Task Pipelines、控制并行度并辅以仓库真实配置与源码佐证读完你即可为 monorepo 配置出一套可复用、可验证的任务执行规则。Lerna 与 Nx任务执行的分工Lerna 本身不直接调度 npm scripts而是把这一职责委托给 Nx。无论是并行执行多个脚本按依赖拓扑顺序执行还是缓存任务结果底层都由 Nx 的任务编排器完成而这一切行为的默认规则都写在仓库根目录的nx.json中。这一点也体现在 Lerna 的命令行输出中——执行lerna run后你会看到 Lerna (powered by Nx) 的字样见 run-tasks.md 中的终端示例。本仓库根目录的 nx.json 就是一个完整的生产级示例它同时配置了namedInputs、targetDefaults、plugins等字段后续章节会以它作为对照来讲解各项配置的真实形态。:::tip 如果仓库中还没有nx.json直接运行npx lerna add-caching。这是一个交互式向导会引导你逐步生成基础的任务执行配置详见 add-caching README命令入口定义在 command.ts。 :::并行执行任务调整 concurrency默认情况下Lerna 会以3个并发进程运行脚本。如果你希望提高并发度比如同时跑 5 个进程可以这样npx lerna run build --concurrency5--concurrency直接作用于任务编排器的进程池大小数值越大同一时刻允许并行运行的 npm scripts 越多。合理调高该值可以充分利用多核 CPU但要注意资源争抢build、test这类 CPU 密集任务并发过高可能导致内存与编译缓存压力上升。此外lerna run还支持一次性触发多个目标并发执行例如npx lerna run test,build,lint当这些目标之间存在依赖关系时比如某些包必须先build再test只要你在nx.json中配置了对应的任务管道任务编排器就会自动协调顺序详见 run-tasks.md。定义任务依赖Task Pipelines仅靠并发参数Lerna 无法得知哪些目标target即 npm script 的名字存在前置条件、哪些没有。任务依赖关系需要在nx.json中显式声明使用的字段是targetDefaults{ ... targetDefaults: { build: { dependsOn: [^build] } } }配置生效后Lerna 就知道在构建某个项目之前必须先构建它的全部依赖项目。而test因为没有声明任何dependsOn不受顺序约束可以在任意时刻运行。:::warning 一旦定义了targetDefaults属性--sort之类的排序标志就会被忽略——任务顺序完全由声明的依赖关系决定。 :::复杂依赖同项目内与跨项目这个机制非常灵活再看一个组合示例{ ... targetDefaults: { build: { dependsOn: [^build, prebuild] }, test: { dependsOn: [build] } } }这里用到了两种依赖语义^脱字符前缀表示依赖项目。build: { dependsOn: [^build] }意味着某项目的build目标必须等它所有依赖项目的build目标完成后才能运行。无前缀表示本项目内。test: { dependsOn: [build] }意味着某项目的test目标必须等它自己项目的build目标完成后才能运行。:::info 较老版本的 Nx 使用targetDependencies而不是targetDefaults。两个字段目前都仍然可用但官方推荐使用targetDefaults。 :::一条命令背后的完整执行链当执行npx lerna run test --scopemyproj时上述配置会告诉 Lerna 依次推导出以下执行链触发myproj的test目标由于声明了test - buildLerna 先运行myproj自身的buildbuild又声明依赖prebuild同项目以及所有依赖项目的build于是 Lerna 会先执行prebuild脚本再执行myproj所有依赖项目的build。关键点在于Lerna 不必先跑完所有 build 再开始跑 test。只要依赖约束被满足任务编排器会尽可能并行地调度任务——这就是任务图执行的典型场景如图所示项目级覆盖在 package.json 中定义 nx 字段由于规则写在了全局的nx.json中它会默认应用到仓库里的所有项目。如果某个项目需要特殊规则可以在该项目的package.json中添加nx字段进行覆盖{ ... nx: { targets: { test: { dependsOn: [ build ] } } } }这样全局targetDefaults提供默认行为项目级nx.targets提供定制行为二者叠加形成最终的任务调度规则。生产仓库中的真实配置对照本仓库自身的 nx.json 就是一套教科书式的targetDefaults实践其中与本文主题直接相关的片段如下{ targetDefaults: { test: { dependsOn: [build], cache: true }, build: { dependsOn: [^build], cache: true }, integration: { dependsOn: [^build], cache: true } } }可以看到仓库对自己的test目标声明了dependsOn: [build]先构建再测试对build与integration声明了dependsOn: [^build]先构建依赖。这正是本文所讲两种语义在生产 monorepo 中的直接落地也验证了targetDefaults中同一个目标可以同时声明项目内与跨项目两类依赖。任务管道与缓存、输入输出的协同任务管道解决的是执行顺序而nx.json中的其他字段则解决哪些输入、产出什么、能否复用cache: true标记该目标可缓存。只有不依赖外部输入如网络请求的脚本才适合缓存build、test通常可缓存start、serve通常不可缓存。inputs声明该目标的输入文件集用于计算缓存命中。例如仓库中test使用[default, ^production, {workspaceRoot}/vitest.shared.ts]表示测试结果会随源文件与共享配置变化。outputs声明该目标产出的文件路径相对项目根例如[{projectRoot}/dist]。这组配置与targetDefaults共同组成了 Nx 的增量构建与缓存体系更深入的机制可参考 how-caching-works.md 与 cache-tasks.md。若想进一步把任务分发到远程执行可阅读 dte-guide.md。用 add-caching 向导快速起步不想手写nx.json时运行npx lerna add-caching即可启动交互式配置向导它会通过问答逐步更新nx.json详见 add-caching READMEWhich scripts need to be run in order?勾选需要按拓扑顺序执行的脚本。若勾选build会生成build: { dependsOn: [^build] }即先构建所有依赖再构建本项目。注意运行向导前Lerna 假设所有脚本都需要按顺序执行运行后只有被勾选标记的脚本才要求拓扑顺序。Which scripts are cacheable?勾选可缓存脚本如build、test生成build: { cache: true }。Does the [script_name] script create any outputs?为每个可缓存脚本指定产出路径相对项目根如dist或覆盖率目录生成build: { outputs: [{projectRoot}/dist] }。向导生成的三种配置片段恰好对应本文讲解的三类能力任务依赖、缓存开关、产物声明足以覆盖大多数 monorepo 的起步需求。总结任务管道配置的核心可以归纳为三点用--concurrency控制并行度用targetDefaults.dependsOn声明项目内无前缀与跨项目^前缀两类依赖再用项目级package.json的nx.targets做定制覆盖。配置完成后Lerna经由 Nx 任务编排器会在满足所有约束的前提下尽可能并行地调度任务并让规则统一作用于仓库中的全部项目。对照本仓库的 nx.json 与 run-tasks.md你可以快速验证并落地这套配置。【免费下载链接】lernaLerna is a fast, modern build system for managing and publishing multiple JavaScript/TypeScript packages from the same repository.项目地址: https://gitcode.com/gh_mirrors/le/lerna创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考