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 不链接本地依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

允许本地项目依赖本地 lerna 包

如何将分叉的 lerna 存储库的子包安装为节点依赖项?

使用 NPM 工作区和 Lerna 在根目录安装 dev 依赖项

在 Netlify Monorepo (Yarn Workspace/Lerna) 上使用 UI 库作为 Web 应用程序的依赖项

如何在不发布的情况下在 lerna monorepo 中构建 docker 镜像

终端默认为旧的纱线版本(lerna bootstrap)