Lerna引导程序不链接本地依赖项吗?

时间:2019-11-18 15:19:18

标签: javascript node.js yarn lerna

使用lerna和本地依赖项的正确方法是什么?


我在单声道仓库中配置了两个模块,以使用具有本地依赖性的lerna。我希望如此

$ lerna bootstrap
$ lerna run test

足以下载所有外部依赖关系,链接本地依赖关系并执行并通过所有模块中的所有测试。

预期行为

根据lerna bootstrap文档:

  
      
  1. 将所有相互依赖的Lerna软件包符号链接在一起。
  2.   

因此,我希望lerna bootstrap将在module-b/node_modules下创建一个指向module-a的符号链接(然后将允许执行并通过测试)。

当前行为

没有链接发生,这会导致测试失败:

  

lerna ERR!纱线运行测试在“模块b”中退出1   lerna ERR!纱线运行测试标准:   纱线运行v1.19.1   开玩笑   信息请访问https://yarnpkg.com/en/docs/cli/run,以获取有关此命令的文档。

     

lerna ERR!纱线测试stderr:   失败./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)

复制步骤

  1. 在下面创建文件夹结构
  2. 将内联的文件复制到其相应目录
  3. 执行$ 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应用程序,并且电子制造商希望将其依赖项安装在packages/module-b/node_modules/文件夹中。

环境

  • lerna --version 3.18.4
  • npm --version 6.11.3
  • yarn --version 1.19.1
  • node --version v12.12.0
  • macOS Mojave 10.14.6

2 个答案:

答案 0 :(得分:0)

我已经尝试过您的实现。

file:../module-a中使用packages/module-b/package.json对我不起作用。

您可以通过为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

答案 1 :(得分:-1)

对我来说,它的工作原理是将其安装并安装在node_module文件夹中

npx lerna exec -- npm install