Yarn 2 工作区未安装依赖项
Posted
技术标签:
【中文标题】Yarn 2 工作区未安装依赖项【英文标题】:Yarn 2 workspaces not installing dependencies 【发布时间】:2021-06-23 10:05:15 【问题描述】:我正在测试设置 yarn 2 工作区。我想我已经按照我应该的方式完成了它,但是当我从根目录运行 yarn install
时,它不会安装任何模块,也不会按预期创建到依赖项的符号链接。我有以下文件夹结构
root/
package-a/
package-b/
每个包含一个 package.json,每个包文件夹包含一个 index.js。这是 package.json 文件
根:
"name": "yarn-workspaces-poc",
"version": "1.0.0",
"license": "MIT",
"private": true,
"workspaces": [
"package-a/",
"package-b/"
]
包-a:
"name": "package-a",
"version": "1.0.0",
"type": "module",
"dependencies":
"cross-env": "5.0.5",
"package-b": "workspace:*"
包-b:
"name": "package-b",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"dependencies":
"cross-env": "5.0.5"
这里是js文件
package-a/index.js
import test from "package-b";
console.log('testing');
console.log(test());
包-b/index.js
export default function b()
console.log("From b. You made it!");
预期的行为是,当我从根目录运行 yarn install
时,将在那里创建一个 node_modules 文件夹。它应该包含 cross-env 包以及符号链接到 package-b 的文件夹。但是什么都没有被创建。这是命令的输出:
➤ YN0000: ┌ Resolution step
➤ YN0000: └ Completed
➤ YN0000: ┌ Fetch step
➤ YN0000: └ Completed
➤ YN0000: ┌ Link step
➤ YN0000: └ Completed
➤ YN0000: Done in 0s 96ms
编辑:
另外,如果我只是运行 package-a 来测试它,结果如下:
internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'package-b' imported from /root/package-a/index.js
Did you mean to import package-b/index.js?
at packageResolve (internal/modules/esm/resolve.js:655:9)
at moduleResolve (internal/modules/esm/resolve.js:696:18)
at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:810:11)
at Loader.resolve (internal/modules/esm/loader.js:86:40)
at Loader.getModuleJob (internal/modules/esm/loader.js:230:28)
at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:56:40)
at link (internal/modules/esm/module_job.js:55:36)
code: 'ERR_MODULE_NOT_FOUND'
【问题讨论】:
yarn v2 一年后仍然很痛苦。我会恢复到 yarn v1 【参考方案1】:我遇到了类似的问题。原来新版本的 Yarn 没有使用 node_modules:
https://yarnpkg.com/getting-started/migration#switching-to-plugnplay
https://yarnpkg.com/getting-started/migration#final-notes
这确实令人困惑,因为它与工作空间的文档不一致。它描述了您(和我)所期望的结果: https://yarnpkg.com/features/workspaces
一旦你运行了“yarn install”,你就可以启动服务器,但是你之前所做的只是在前面加上“yarn workspace WORKSPACENAME”..
所以如果你通常是这样开始的:
rootfolder$ cd package-b
package-b$ node index.js
您现在可以从根文件夹运行它:
rootfolder$ yarn workspace package-b node index.js
您可能还需要为您的 IDE 等设置一些其他的东西。这里有很多信息: https://yarnpkg.com/getting-started/migration#switching-to-plugnplay
【讨论】:
【参考方案2】:在你的 monorepo 的根目录下创建一个.yarnrc.yml
,
添加以下属性:
nodeLinker: node-modules
也许 Yarn 2 最显着的变化是 PnP 系统。告别node_modules
这是默认行为,除非您指定“旧版”node-modules
链接器
记录在案的here
奖金信息
对于单独部署包,它有时有助于防止将node_modules
提升到根目录。
你可以添加
nmHoistingLimits: workspaces
发送至.yarnc.yml
,以确保每个包都直接在包级别安装其依赖项。
这比 yarn 1 中的旧 noHoist: [*/**]
更加健壮。
【讨论】:
以上是关于Yarn 2 工作区未安装依赖项的主要内容,如果未能解决你的问题,请参考以下文章