pnpm 12 workspace 路径 override 安装成功,require 却找不到包
pnpm 12.14.0 把根 workspace 路径 override 原样交给嵌套成员,可生成悬空链接或注入安装失败。使用逐成员路径改写,并验收真实导入。
根工作区把 target 覆盖到 workspace:./packages/target,嵌套消费包安装时却查找自己的 packages/target。在 pnpm 12.14.0,这可能表现为两种故障:开启 injectWorkspacePackages 时安装直接失败;关闭注入时安装退出码为 0,生成的链接却指向不存在的目录,随后 require 找不到包。
如果目标与消费方都是当前 workspace 的成员,要检查根 override 的相对路径是否为每个消费目录重新计算。关闭注入只改变错误出现的阶段,不代表链接已正确。
根目录的路径不能原样交给深层成员
例如现有目录为:
repo/
pnpm-workspace.yaml
packages/
target/
deep/
consumer/
根配置中的相关部分是:
packages:
- packages/**
overrides:
target: workspace:./packages/target
这条路径表示 repo 下的 packages/target。应用到 packages/deep/consumer 时,仍应指向同一目标,而不是把 ./packages/target 接到 consumer 后面。受影响的解析可能报告:
Could not install from "<root>/packages/deep/consumer/packages/target" as it does not exist.
Failed to resolve target@workspace:./packages/target
非注入路径也要检查 consumer/node_modules/target 的最终指向。安装成功但链接悬空,和目标包根本没被 workspace 范围包含,是不同问题;不能因为本地有一个同名目录就跳过成员清单与包名核对。
12.15.0 已包含根路径锚定与逐成员改写
pnpm 12.15.0 的正式 override 实现会把 workspace 路径解析为根目录下的目标,再按消费方 manifest 所在目录输出相对路径。12.14.0 的对应处理只识别 file、link 等文件系统协议,没有把 workspace 路径纳入同一转换。
通过项目原有版本管理方式采用兼容的正式实现,保留清单、workspace 配置与锁文件后再运行既有安装流程。检查实际执行的 pnpm 版本,避免本机已换版本、CI 仍由另一入口调用旧版本。
确实无法更新时,可评估在相关成员清单中声明各自正确的 workspace 相对路径,或者调整根 override 策略。不要把同一条根路径复制到每个深层成员。改成 file: 可能绕开这条解析,但会改变依赖协议与安装语义,尤其涉及注入、peer 依赖或本地包交付时,须单独验证,不能当作等价替换。
这个范围限定为工作区成员消费工作区目标的相对 workspace override。非工作区包内部依赖、配置 include 的路径来源及其他解析问题,不因这一条修复就全部成立。若是下载的发布包仍残留 workspace:*,应另查发布归档里的未转换协议,它不靠重新计算 consumer 路径解决。
验收至少在原来的嵌套成员中完成安装、解析与实际导入,并检查注入设置是否仍符合原项目要求。随后用审定锁文件进行正常可重复安装,确认链接不再依赖某台机器上的绝对目录。不要仅删除 node_modules 后看退出码,也不需要清空整个共享 store;那样会丢失现场,却没有证明路径计算正确。


