pnpm workspace 中如何正确引用本地包?
我在用 pnpm 的 workspace 功能,主项目想引用另一个本地 package,但总是报模块找不到。我试过在 package.json 里加 dependencies,也运行了 pnpm install,但还是不行。
比如我的结构是这样的:
import { greet } from 'my-utils';
console.log(greet('world'));
这个 my-utils 是 workspace 里的一个子包,已经配置了 name 和 exports,但运行时提示 Cannot find module ‘my-utils’,到底哪里出错了?
首先,检查你的
pnpm-workspace.yaml文件,确保my-utils被正确地列在packages字段下,通常是这样:这里假设
my-utils在packages目录下。然后,在
my-utils的package.json中,确保name字段设置为my-utils,这个值是你在主项目中引用的名字。接下来,检查主项目的
package.json,确保在dependencies或devDependencies中有正确的引用,应该是这样的:别忘了运行
pnpm install来安装依赖。最后,确保你的代码引用路径是对的,你写的
import { greet } from 'my-utils';应该没问题,前提是my-utils的exports或者main字段指向了正确的入口文件。如果这些都做了还是有问题,可能是
node_modules出了问题,试试删除node_modules和pnpm-lock.yaml,然后重新运行pnpm install。记得转义特殊字符,尤其是如果你的包名或者路径里有非字母数字字符的话,虽然通常不应该有这种情况。
希望这能帮到你,解决这个问题。
1. 子包的 name 字段
确认你的 my-utils 包的 package.json 里有 name 字段,而且名字要完全一致:
2. 根目录的 pnpm-workspace.yaml
确保根目录有 workspace 配置:
或者你的目录结构可能不是 packages/ 开头,那改成你实际的路径。
3. 主项目的 dependencies
在主项目的 package.json 里明确声明依赖:
重点是
workspace:*这个协议,pnpm 需要这个来识别是本地 workspace 包。4. 执行安装
配置改完之后,一定要删掉 node_modules 和 pnpm-lock.yaml,重新跑一遍:
pnpm workspace 对符号链接的处理比较敏感,有时候缓存会导致问题。
5. 常见坑:子包没有正确导出
如果 my-utils 是用 TypeScript 写的,确认它的 package.json 里的 main 或 exports 指向的是编译后的 JS 文件,而不是 .ts 源文件。pnpm 不会自动编译 TypeScript。
你检查一下这几个配置点,基本就能定位问题在哪里了。