
Vitest 仓库 pnpm 升级后兼容性排坑指南5 类故障快速修复【免费下载链接】vitestNext generation testing framework powered by Vite.项目地址: https://gitcode.com/GitHub_Trending/vi/vitest你在 Vitest 仓库执行pnpm install却卡在ERR_PNPM_RECURSIVE_RUN_NON_ZERO上esbuild 的二进制文件缺失整条构建链停摆。这类 pnpm 升级后的兼容性问题大多不是依赖本身坏了而是 pnpm 10 起引入的供应链安全默认值在老配置上翻旧账。这篇指南按症状定位、按成本修复帮你把测试工作流拉回来。快速自查30 秒判断你是否踩坑先看你的报错命中哪几条典型症状大概率原因install报esbuild/sharp等原生模块构建脚本被跳过pnpm 10 默认拦截依赖的 postinstallERR_PNPM_LOCKFILE_BREAKING_CHANGE或ERR_PNPM_BAD_NODE_MODULES跨大版本 pnpm 切换虚拟存储不兼容构建时Patch application failed或补丁未生效patchedDependencies与补丁文件不匹配ERR_PNPM_WORKSPACE_PKG_NOT_FOUNDpnpm-workspace.yaml的 packages 覆盖不全并发跑测试安装时EBUSY/文件锁冲突shell 模拟与并发写竞争一条都没命中基本可以排除 pnpm 版本因素回到依赖本身排查。旧行为 vs 新行为只留和你故障相关的维度pnpm 9 及以前pnpm 10 起依赖的 postinstall 构建脚本默认执行默认拦截须显式加入allowBuilds白名单锁文件版本6.09.0引入catalogs结构工作区配置.npmrc承担部分职责pnpm-workspace.yaml成为唯一事实来源供应链策略宽松trustPolicy: no-downgrade等默认收紧锁文件来源信任声明版本信任已提交锁文件的解析结果可以把锁文件理解成一份依赖清单快照pnpm 10 换了快照格式旧工具读新快照就会卡住。Vitest 仓库的快照当前就是 9.0 格式pnpm-lock.yaml 首行即lockfileVersion: 9.0。5 分钟止血先让流程跑起来每条只说三件事现象、原因、动作。① 原生模块构建被拦截最常见现象install成功但运行时报esbuild: binary not found之类。 原因pnpm 10 起依赖的构建脚本默认不执行必须白名单放行。 动作在 pnpm-workspace.yaml 的allowBuilds中补上对应包仓库现有写法可直接参考# pnpm-workspace.yaml allowBuilds: esbuild: true sharp: true改完重新pnpm install让脚本补跑。② 锁文件跨版本冲突现象ERR_PNPM_LOCKFILE_BREAKING_CHANGE或提示 node_modules 与当前 pnpm 不匹配。 原因不同大版本的 pnpm 使用不兼容的虚拟存储布局。 动作彻底清干净再装不要增量修复rm -rf node_modules rm -f pnpm-lock.yaml pnpm install仓库内操作请谨慎只删除自己环境里的node_modules和锁文件改完提交前确认锁文件 diff 合理。③ 脚本报取不到 VITEST_环境变量* 现象某脚本能读VITEST_MODULE_DIRECTORIES但换机器后取值为空。 原因这类变量是写在仓库根 .npmrc 里的pnpm 10 后部分人习惯把它们挪进 shell 配置导致工作区脚本丢失。 动作确认变量仍在根目录.npmrc中声明# .npmrc VITEST_MODULE_DIRECTORIES/node_modules/,/packages/彻底根治从源头消除复发④ 补丁应用失败现象构建日志出现Patch application failed或补丁改了却不起效。 原因pnpm-workspace.yaml 中patchedDependencies的键包名精确版本与 patches/ 下实际补丁文件不匹配版本漂移一次就会对不上。 动作别手改映射表走官方流程重新生成pnpm patch cac6.7.14 # 进入临时目录修改源码 pnpm patch-commit 路径 # 重新落盘补丁并自动更新映射仓库现有 4 个补丁fake-timers、acorn、cac、rrweb-snapshot都可以用同样方式重生成。⑤ 工作区依赖找不到 并发锁冲突现象ERR_PNPM_WORKSPACE_PKG_NOT_FOUND或 Windows 上EBUSY。 原因pnpm-workspace.yaml的packages没覆盖到该目录EBUSY 则是 shell 语义差异下的临时文件竞争。 动作确认 packages 列表完整并启用 shell 模拟# pnpm-workspace.yaml packages: - docs - packages/* - examples/* - test/* shellEmulator: true升级后的验收清单逐项打勾全绿再提交pnpm --version与 package.json 中packageManager字段当前为pnpm11.24.0一致pnpm install零报错且原生模块esbuild 等二进制可用pnpm run build全量构建通过pnpm run test核心单测通过补丁相关包行为正常跑一次test/unit中涉及 fake timers / CLI 解析的用例提交前git diff pnpm-lock.yaml无意外的大幅版本漂移防坑两条建议把 pnpm 版本钉死始终用package.json里的packageManager字段 corepack启动别在机器上混用多个大版本——绝大多数升级后坏掉都来自这个。白名单进仓库别进个人习惯allowBuilds、patchedDependencies一律提交到 pnpm-workspace.yamlCI 才能复现你的本地行为。延伸阅读docs/guide/migration.md、docs/guide/improving-performance.md、多项目配置示例见 test/workspaces/。【免费下载链接】vitestNext generation testing framework powered by Vite.项目地址: https://gitcode.com/GitHub_Trending/vi/vitest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考