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),仅供参考