pnpm v12 工作区任务编排指南:tasks/dependsOn 依赖图、并发组与缓存化 CI 管线
AI 技能人工智能【免费下载链接】skillsAnthony Fus curated collection of agent skills.项目地址https://gitcode.com/gh_mirrors/skills11/skills点击查看免费下载本篇聚焦 pnpm v12 的Workspace Task Orchestration工作区任务编排如何用pnpm-workspace.yaml中的tasks/dependsOn声明跨项目任务依赖图、用并发组与优先级控制执行槽位以及如何使用实验性的pnpm pipeline运行带缓存的 CI 式任务管线。读完本文你可以在 monorepo 中精确控制谁先跑、谁并行跑、跑多少并用--dry-run和tasks status验证调度行为最终把 CI 变成可增量缓存的 pipeline 执行。一、任务调度模型任务图与就绪规则pnpm -r run script并不是简单地对每个项目依次执行脚本而是调度一张工作区任务图task graph。核心概念如下任务的表示形式一个任务即project#script例如packages/ui#build就绪ready规则一个任务只有在它依赖的所有任务都成功完成后才变为就绪并发上限就绪任务在--workspace-concurrency的上限内并行执行相互独立的任务执行顺序不可预测由调度器自行决定失败语义默认--bail行为下一旦有任务失败正在运行的任务会被取消且不再派发新任务。这套模型是 core-workspaces 中跨项目任务图Cross-project task graphs章节的完整展开也出现在 CLI 命令参考 的 Task orchestration pipelines 一节中pnpm -r run script # 运行任务图 pnpm -r run --dry-run build # 检查任务图 pnpm tasks status # 查看每个并发组的运行/等待任务v12.6 pnpm pipeline [name] # 带缓存的 CI 式运行v12.4实验性二、声明任务依赖tasks与dependsOn依赖关系配置在pnpm-workspace.yaml的tasks键下注意pnpm v12 的配置使用camelCase键且不再从.npmrc或package.json的pnpm字段读取设置tasks: build: dependsOn: - ^build # 先构建每个 workspace 依赖项 test: dependsOn: - build # 先在同一项目内执行 builddependsOn中的条目支持两种写法build→ 同一项目内的build任务项目内依赖^build→ 每个被选中的 workspace 依赖项中的build任务跨项目依赖^前缀。默认规则与显式空依赖陷阱两条默认规则直接决定你的依赖图形状必须特别注意没有tasks条目的任务默认依赖其在 workspace 依赖项中的同名任务——即未配置的build行为等价于dependsOn: [^build]从而天然保持依赖先于依赖方deps-before-dependents的拓扑顺序一旦某任务有了tasks条目但省略了dependsOn含义是dependsOn: []无依赖而不是继承默认行为。也就是说如果你为了给build设置concurrency而新建了条目却又想让拓扑顺序继续生效必须显式声明tasks: build: concurrency: 2 dependsOn: [^build] # 必须显式写出否则变成无依赖依赖作用域与 pass-through 语义任务依赖始终限制在--filter/includeWorkspaceRoot所选中的项目范围内——被过滤掉的项目不会引入额外的依赖边某个项目如果缺失被引用的脚本名例如dependsOn指向build但该项目没有build脚本该任务被视为pass-through会被报告为 skipped但不会中断依赖链。这一 pass-through 语义对混合仓库部分包没有 lint/test 脚本非常关键声明统一的tasks图而无需为每个项目补齐同名脚本。三、任务级并发concurrency与--workspace-concurrency的区别tasks: build: concurrency: 2 # 所有项目中同时运行的 build 实例最多 2 个 dependsOn: [^build]两者是相互独立的调度维度--workspace-concurrency整个递归调度的工作区槽位总数也可在pnpm-workspace.yaml中以workspaceConcurrency配置例如workspaceConcurrency: 4tasks.name.concurrency单个任务名跨项目的实例上限。关键行为一个任务在等待自己的concurrency槽位时并不占用工作区槽位。这意味着 CPU 密集型的build被限制到 2 个并发时等待中的项目不会阻塞 I/O 型任务如 lint使用工作区槽位——调度粒度比单纯的--workspace-concurrency更细。四、并发组v12.5.0跨进程、机器级的槽位池concurrencyGroup解决的问题超出了单次pnpm -r run的范围多个 pnpm 进程共享同一份机器级限制。只要进程使用相同的stateDir限制就互相可见包括pnpm pipeline进程tasks: test:rust: concurrencyGroup: cargo dependsOn: [] concurrencyGroups: cargo: 2 # 全机器同时最多 2 个 cargo 任务跨进程典型场景Rust/Cargo 子项目的测试极耗 CPU你希望即使有多个 pnpm 进程例如多个 Agent 会话、多个 CI 容器挂载同一stateDir在跑同时进行的 cargo 任务总数也不超过 2。语义要点嵌套在同一组内的pnpm run会复用父进程已占用的槽位不会重复计数槽位在进程退出或崩溃时释放不会因任务卡住而泄漏给僵尸计数缺失或为 0 的组上限表示不限制——组只是一个命名标签必须配合concurrencyGroups中的数字才生效改变stateDir即得到一套独立的槽位池因此不同stateDir的进程互不影响。五、任务优先级v12.6.0与组状态检查优先级prioritypriority为整数默认值0。它只影响等待中的任务在可用槽位释放时的抢占顺序——数值高的先运行数值相同时按到达先后排序tasks: build:critical: { concurrencyGroup: build, priority: 10 } build:cleanup: { concurrencyGroup: build, priority: -1 }上例中build:critical和build:cleanup共享build并发组但槽位紧张时关键构建永远排队在前清理任务排在最后。检查组内状态v12.6.0pnpm tasks status [groups...] # 显示每个组的运行中 等待中任务 pnpm pm tasks status # 若项目里有名为 tasks 的 npm script 遮蔽了内置命令用 pm 前缀强制调用内置命令pnpm pm是绕过package.jsonscripts 遮蔽的强制入口——这在仓库根目录定义了tasks: some-script时特别有用。六、检查任务图--dry-run在真正执行前验证依赖声明是否正确两个命令pnpm -r run --dry-run build # 输出稳定的拓扑顺序不执行任何脚本 pnpm -r run --dry-run --json test # 以 JSON 输出节点与边--dry-run给出稳定的拓扑顺序适合用来核对^build展开后是否指向了正确的项目集合、--filter收窄后的图是否符合预期。JSON 形态节点 边则方便脚本化校验例如在 CI 中 diff 任务图防止依赖声明被意外改动。七、递归运行的调度选项选项行为--resume-from pkg从某个包的任务处断点续跑跳过上一次同一调用same invocation已记录为通过的任务--reverse反转所有边——依赖方先运行例如先拆下游再动上游--no-bail某个任务失败后继续运行其余相互独立的就绪任务默认--bail会取消正在运行的任务并停止派发--resume-from对长时间构建非常实用一次pnpm -r run build在某个包失败后修复该包再跑同一调用加--resume-from已通过的任务直接跳过。输出行为同一时刻只有一个脚本能运行时输出直接继承终端无缓冲前缀多个脚本并行时输出会被管道收集。需要实时输出时用--stream带项目名前缀、逐行即时打印需要按项目聚合时用--aggregate-output。这与 core-workspaces 中给出的日常运行方式一致pnpm -r run build # 全部项目 pnpm -r --workspace-concurrency1 run build # 严格拓扑串行 pnpm -r --parallel run test # 并行 pnpm -r --stream run dev # 流式输出八、循环依赖ERR_PNPM_TASK_CYCLE与ignoreWorkspaceCycles任务图中出现环会在任何脚本执行之前失败错误码为ERR_PNPM_TASK_CYCLE。只有在你刻意制造了环例如两个包必须互相先构建时才设置ignoreWorkspaceCycles: true该配置会让 pnpm 发出警告并丢弃环内成员之间的排序保证——即环内任务的执行顺序不再由依赖关系决定。core-workspaces 中也把它与requiredScripts每个项目必须存在的脚本否则pnpm -r run name直接失败并列为工作区设置项默认值为false。九、忽略tasks声明的命令以下情况tasks/dependsOn声明不生效调度回退到原有行为--no-sort显式禁用拓扑排序忽略tasks声明--parallel隐式蕴含--no-sort同样忽略tasks声明纯并行广播递归execpnpm -r exec cmd没有脚本名因此无法加入dependsOn依赖图但它仍然使用依赖感知调度并支持--resume-from。换言之凡是需要跨项目依赖排序的场景都应走runexec只享受调度层面的依赖感知工作区依赖完成后再开始。十、pnpm pipelinev12.4.0实验性带缓存的 CI 式任务管线pnpm pipeline按CI 作业的方式运行一组命名任务先执行frozen install再运行受影响项目affected-since-base的任务图并恢复缓存命中的结果。它是目前文档中唯一消费outputs/inputs/env/cache/cargoTargetDir这些字段的命令。完整配置示例tasks: build: { dependsOn: [^build], outputs: [dist/**], inputs: [src/**], env: [NODE_ENV] } test: { dependsOn: [build], outputs: [] } lint: { outputs: [] } pipelines: default: [build, test, lint] release: [build]pnpm pipeline # 运行名为 default 的管线 pnpm pipeline release # 运行自定义管线仅 build pnpm pipeline --dry-run --json pnpm pipeline --full # 运行所有项目而不只是 affected-since-base pnpm pipeline --base ref # 指定受影响的 diff 基准默认 origin/main或配置项 pipelineBase pnpm pipeline --no-cache缓存规则逐字段字段作用outputs任务只有声明了outputs才可缓存。outputs: []是合法且重要的声明——表示不产生文件使 linter/test 这类无产物任务也可缓存inputs收窄缓存 key 的输入范围glob语法表示在默认输入之外追加env指定需要参与哈希的环境变量名如NODE_ENV变量变化则缓存失效cache: false显式退出缓存缓存 key 还自动覆盖脚本文本本身、依赖任务的 key、lockfile、运行时runtime——即改了一行脚本、升了一个依赖或换了 Node 版本都会自然 miss。命中时 pnpm恢复文件并回放日志replay logsCI 上看起来与真实执行无差。两条必须牢记的边界普通的递归pnpm run永远不会从 pipeline 缓存恢复——outputs/inputs/env/cache/cargoTargetDir只被pnpm pipeline读取。本地开发跑pnpm -r run build不会因为 pipeline 缓存命中而秒过管线默认只跑相对 base默认origin/main可用pipelineBase配置有变更的受影响项目--full才跑全部项目——这与 CI 增量构建语义完全对齐。Cargo 构建状态cargoTargetDir对 monorepo 中混合的 Rust 包cargoTargetDir: target让任务在多次运行 / 多个 git worktree 之间通过不可变快照保留 Cargo 的 target 目录避免每次都冷编译。这与 features-multi-ecosystem 中提到的 Cargo 依赖实验性多生态支持配套使用。十一、其他依赖感知命令除了pnpm -r run以下工作区命令同样遵循项目的工作在其 workspace 依赖完成后立即开始的依赖感知调度——沿包依赖图而非tasks声明推进不再等待无关的拓扑分组workspace install安装rebuild重建pack / publish打包 / 发布stage发布暂存lifecycle work生命周期任务也就是说这些命令的排序依据是包图与第二节的手动tasks声明是两套独立机制。十二、最小实践清单把本文的机制落到pnpm-workspace.yaml一个典型 monorepo 的推荐写法tasks: build: concurrency: 2 dependsOn: [^build] # 显式声明避免有条目即无依赖的默认值 test: dependsOn: [build] # 项目内依赖 pipelines: default: [build, test]配套操作习惯改动tasks声明后先用pnpm -r run --dry-run --json build核对节点与边对 CPU 密集任务如 cargo配concurrencyGroupconcurrencyGroups数值上限并用pnpm tasks status观察等待队列CI 中改用pnpm pipeline替换pnpm ci pnpm -r run build让outputs/inputs/env声明参与缓存命中需要绕过 npm script 遮蔽内置命令时用pnpm pm cmd。以上内容与仓库中 pnpm 技能的元信息一致该技能基于 pnpm 12.x 文档生成覆盖 v11 与 v12 行为其中工作区任务编排workspace task orchestration正是 v12 的重点能力之一详见 pnpm 技能主文件。由于pipeline仍标注为实验性experimental在生产 CI 中建议先用--dry-run --json验证任务图与缓存策略再逐步启用完整缓存。赞分享AI 技能人工智能【免费下载链接】skillsAnthony Fus curated collection of agent skills.项目地址https://gitcode.com/gh_mirrors/skills11/skills点击查看免费下载相关推荐JetBrains IDE评估重置工具告别试用期中断的开发伴侣JetBrains IDE评估重置工具告别试用期中断的开发伴侣 你是否曾在深夜调试代码时突然被IDE弹出的试用期到期提示打断思路或者团队项目临近交付开发构建工具开发工具CLIconvex-backend TypeScript Monorepo 开发指南pnpm 工作区、Turborepo 任务编排与代码组织convex backend TypeScript Monorepo 开发指南pnpm 工作区、Turborepo 任务编排与代码组织 本篇指南围绕开源仓库数据库后端Hyperf DAG 任务编排指南用有向无环图优雅调度依赖与并发任务Hyperf DAG 任务编排指南用有向无环图优雅调度依赖与并发任务 导读 hyperf/dag 是 Hyperf 生态中的轻量级 有向无环图Directe后端Web框架微服务RPC框架异步编程上一篇如何用SRWE工具突破游戏窗口分辨率限制下一篇Excalidraw 开源手绘白板三步画出第一张图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Deis store-metadata 组件定制指南:Ceph MDS 元数据服务与 etcd 键调优

Deis store-metadata 组件定制指南:Ceph MDS 元数据服务与 etcd 键调优

后端云原生 【免费下载链接】deis Deis v1, the CoreOS and Docker PaaS: Your PaaS. Your Rules. 项目地址: https://gitcode.com/gh_mirrors/de/deis 点击查看 免费下载 store-metadata 是 Deis v1 平台内置 Ceph 存储栈(store 组件)中负…

2026/10/10 5:55:45 阅读更多 →
CMake 3.31 策略 CMP0178:测试命令行保留空参数(TEST_LAUNCHER 与 CROSSCOMPILING_EMULATOR)

CMake 3.31 策略 CMP0178:测试命令行保留空参数(TEST_LAUNCHER 与 CROSSCOMPILING_EMULATOR)

构建工具开发工具CLI 【免费下载链接】CMake Mirror of CMake upstream repository 项目地址: https://gitcode.com/gh_mirrors/cm/CMake 点击查看 免费下载 导读 CMP0178 是 CMake 3.31 引入的兼容性策略,核心变化是:由 add_test()、Exter…

2026/10/10 5:55:45 阅读更多 →
TVA具身智能系统简介(16):推演机制与数字物理融合逻辑

TVA具身智能系统简介(16):推演机制与数字物理融合逻辑

前沿技术探索:TVA智能体(简称TVA,亦称“TVA视觉智能体”或“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术框架。它深度融合深度强化学习(DRL)、卷积神经网络(C…

2026/10/10 5:55:45 阅读更多 →

最新新闻

nano代替vim:Linux新手与运维的终端编辑新选择

nano代替vim:Linux新手与运维的终端编辑新选择

1. 别再被vim劝退了:聊聊nano代替vim这件事先说说我自己的经历。刚接触Linux那会儿,我听到最多的一句话就是“你必须学会vim,因为你迟早要在终端里改配置”。于是我硬着头皮看了不少教程,记住了i进入插入模式、Esc退出、:wq保存&a…

2026/10/10 6:34:57 阅读更多 →
Flask + SQLAlchemy 实战:从数据模型到查询优化的完整指南

Flask + SQLAlchemy 实战:从数据模型到查询优化的完整指南

简介:面向优达学城全栈开发课程的Fyyur项目源码,主要服务于正在学习Flask与PostgreSQL数据建模的开发者。项目围绕音乐演出场地和艺术家预约网站展开,要求为现有视图与控制器补齐数据模型,实现对场所、艺术家及表演场次的创建、检…

2026/10/10 6:34:57 阅读更多 →
Exadata X9M数据库一体机全解读:从原理到落地的避坑指南

Exadata X9M数据库一体机全解读:从原理到落地的避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 6:34:57 阅读更多 →
Unity反编译实战:用dnSpy分析并修改游戏代码

Unity反编译实战:用dnSpy分析并修改游戏代码

简介:dnSpy是一款功能强大的.NET程序反编译与调试工具,专为Unity开发者、游戏引擎研究者及希望从现有软件中学习代码逻辑的技术人员准备。借助该工具,可直接打开并分析Unity项目生成的C#程序集(dll),还原类…

2026/10/10 6:34:57 阅读更多 →
Fyyur实战:Flask全栈项目从跑通到ORM进阶与避坑指南

Fyyur实战:Flask全栈项目从跑通到ORM进阶与避坑指南

简介:Fyyur-Udacity-Project是Udacity全栈开发课程中的音乐演出场地与艺术家预定网站项目,适合正在学习Flask、PostgreSQL和Web API设计的开发者。该项目已具备视图与控制器,但缺少数据模型和数据库交互能力,学习重点在于补全模型…

2026/10/10 6:34:57 阅读更多 →
Spring Boot+微信小程序高校共享图书借阅系统实战解析

Spring Boot+微信小程序高校共享图书借阅系统实战解析

去年帮某高校的一位学弟做毕设,对方只丢过来一句话:“想做一个高校共享图书借阅的小程序,后端用Spring Boot。”这句话听起来不难,但真正动手才发现,共享借阅这事儿背后藏着一整条业务链:用户身份认证、图书…

2026/10/10 6:33:57 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →