Lerna bootstrap 不链接本地依赖项?
Posted
技术标签:
【中文标题】Lerna bootstrap 不链接本地依赖项?【英文标题】:Lerna bootstrap does not link local dependencies? 【发布时间】:2020-03-14 00:14:21 【问题描述】:使用 lerna 和本地依赖项的正确方法是什么?
我在一个单声道存储库中配置了两个模块,以使用具有本地依赖项的 lerna。我预料到了
$ lerna bootstrap
$ lerna run test
足以下载所有外部依赖项、链接本地依赖项并执行并通过所有模块中的所有测试。
预期行为
根据lerna bootstrap 文档:
将所有相互依赖的 Lerna 包符号链接在一起。
因此,我预计 lerna bootstrap
会在下面的 module-b/node_modules
中创建一个指向 module-a
的符号链接(这样就可以执行并通过测试)。
当前行为
没有发生链接,导致测试失败:
lerna 错误!纱线运行测试在“模块-b”中退出 1 错了!纱线运行测试标准输出: 纱线运行 v1.19.1 $开玩笑 info 访问https://yarnpkg.com/en/docs/cli/run 获取有关此命令的文档。
lerna 错误!纱线运行测试标准错误: 失败./import.test.js ● 测试套件无法运行
Cannot find module 'module-a' from 'import.test.js' > 1 | const moduleA = require('module-a'); | ^ 2 | 3 | test('should import module-a', () => 4 | moduleA(); at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:259:17) at Object.<anonymous> (import.test.js:1:1)
复制步骤
-
在下面创建文件夹结构
将内联的文件复制到对应的目录中
执行
$ lerna bootstrap
,然后执行$ lerna run test
project-root
+ packages
| + module-a
| | + package.json
| | + index.js
| |
| + module-b
| | + package.json
| | + import.test.js
|
+ lerna.json
packages/module-a/package.json
"name": "module-a",
"version": "1.0.0",
"private": true,
"main": "index.js",
"scripts":
"test": "echo \"Test passed in module-a\""
packages/module-a/index.js
module.exports = () => console.log('Log in module-a');
packages/module-b/package.json
"name": "module-b",
"version": "1.0.0",
"private": true,
"main": "index.js",
"scripts":
"test": "jest"
,
"dependencies":
"module-a": "file:../module-a"
,
"devDependencies":
"jest": "^24.9.0"
packages/module-b/import.test.js
const moduleA = require('module-a');
test('should import module-a', () =>
moduleA();
);
lerna.json
"npmClient": "yarn",
"packages": [
"packages/*"
],
"version": "independent"
观察
执行lerna link --force-local 不会改变现状,测试仍然失败,因为module-b/node_modules/
仍然不包含对module-a
的引用。
备注
我不能将 yarn workspaces 与 lerna 一起使用,因为 module-b
是一个 Electron 应用程序,并且 electron 构建器希望其依赖项安装在 packages/module-b/node_modules/
文件夹中。
环境
lerna --version 3.18.4 npm --version 6.11.3 yarn --version 1.19.1 节点 --version v12.12.0 macOS Mojave 10.14.6【问题讨论】:
投票this proposal 以缓解标签混淆。 【参考方案1】:我已经尝试过你的实现。
在packages/module-b/package.json
中使用file:../module-a
对我不起作用。
您可以通过为module-a
编写版本号来轻松绕过它(这并不重要,因为我们将使用force-local
)
"name": "module-b",
"version": "1.0.0",
"private": true,
"main": "index.js",
"scripts":
"test": "jest"
,
"dependencies":
"module-a": "1.0.0"
,
"devDependencies":
"jest": "^24.9.0"
在项目的根目录:
本地版本的引导和链接:
npx lerna bootstrap --force-local
运行测试:
npx lerna run test
【讨论】:
另一种解决方法是手动“提升”您的包内依赖项,方法是根据lerna issue #2352 将它们添加到根 package.json。理想情况下,PR #2789 会解决这个问题。【参考方案2】:对我来说它的工作,并在 node_module 文件夹中安装包
npx lerna exec -- npm install
【讨论】:
我不认为这是一个有效的解决方案。这将对 repo 中的每个包执行npm install
,这需要很长时间,并且不需要完成。 lerna bootstrap
应该链接到已经安装的包。问题是有时它不会链接依赖项的依赖项......我的引导命令末尾的lerna link
似乎正在修复它......但我仍在检查......以上是关于Lerna bootstrap 不链接本地依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
使用 NPM 工作区和 Lerna 在根目录安装 dev 依赖项
在 Netlify Monorepo (Yarn Workspace/Lerna) 上使用 UI 库作为 Web 应用程序的依赖项