pnpm workspace 中如何正确引用本地包?

南宫雨妍 阅读 57

我在用 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’,到底哪里出错了?

我来解答 赞 14 收藏
二维码
手机扫码查看
2 条解答
司徒新霞
在 pnpm workspace 中引用本地包,确保几个关键点都对了才行。

首先,检查你的 pnpm-workspace.yaml 文件,确保 my-utils 被正确地列在 packages 字段下,通常是这样:
packages:
- 'packages/*'

这里假设 my-utilspackages 目录下。

然后,在 my-utilspackage.json 中,确保 name 字段设置为 my-utils,这个值是你在主项目中引用的名字。

接下来,检查主项目的 package.json,确保在 dependenciesdevDependencies 中有正确的引用,应该是这样的:
"dependencies": {
"my-utils": "workspace:*"
}


别忘了运行 pnpm install 来安装依赖。

最后,确保你的代码引用路径是对的,你写的 import { greet } from 'my-utils'; 应该没问题,前提是 my-utilsexports 或者 main 字段指向了正确的入口文件。

如果这些都做了还是有问题,可能是 node_modules 出了问题,试试删除 node_modulespnpm-lock.yaml,然后重新运行 pnpm install

记得转义特殊字符,尤其是如果你的包名或者路径里有非字母数字字符的话,虽然通常不应该有这种情况。

希望这能帮到你,解决这个问题。
点赞
2026-03-24 21:06
爱学习的梓玥
这个问题很典型,基本是这几个地方没配对:

1. 子包的 name 字段

确认你的 my-utils 包的 package.json 里有 name 字段,而且名字要完全一致:

{
"name": "my-utils",
"version": "1.0.0",
"main": "dist/index.js"
}


2. 根目录的 pnpm-workspace.yaml

确保根目录有 workspace 配置:

packages:
- 'packages/*'


或者你的目录结构可能不是 packages/ 开头,那改成你实际的路径。

3. 主项目的 dependencies

在主项目的 package.json 里明确声明依赖:

{
"name": "main-project",
"dependencies": {
"my-utils": "workspace:*"
}
}


重点是 workspace:* 这个协议,pnpm 需要这个来识别是本地 workspace 包。

4. 执行安装

配置改完之后,一定要删掉 node_modules 和 pnpm-lock.yaml,重新跑一遍:

rm -rf node_modules pnpm-lock.yaml && pnpm install


pnpm workspace 对符号链接的处理比较敏感,有时候缓存会导致问题。

5. 常见坑:子包没有正确导出

如果 my-utils 是用 TypeScript 写的,确认它的 package.json 里的 main 或 exports 指向的是编译后的 JS 文件,而不是 .ts 源文件。pnpm 不会自动编译 TypeScript。

你检查一下这几个配置点,基本就能定位问题在哪里了。
点赞
2026-03-17 11:04