Lerna bootstrap не связывает локальные зависимости?

Как правильно работать с lerna и локальными зависимостями?


Я настроил два модуля в монорепозитории для использования lerna с локальной зависимостью. Я ожидал этого

$ lerna bootstrap
$ lerna run test

будет достаточно, чтобы загрузить все внешние зависимости, связать локальную зависимость, выполнить и пройти все тесты во всех модулях.

Ожидаемое поведение

Согласно документации lerna bootstrap:

  1. Свяжите вместе все пакеты Lerna, которые являются зависимостями друг от друга.

Таким образом, я ожидал, что lerna bootstrap создаст символическую ссылку в module-b/node_modules ниже, которая указывает на module-a (что затем позволит выполнить и пройти тесты).

Текущее поведение

Связывание не происходит, что приводит к сбою тестов:

lerna ERR! Тест прогона пряжи завершился 1 в 'module-b' lerna ERR! yarn run test stdout: yarn run v1.19.1 $ jest info Посетите https://yarnpkg.com/en/docs/cli/run, чтобы получить документацию по этой команде.

lerna ERR! yarn run test stderr: FAIL ./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     

пакеты / модуль-а / пакет.json

{
  "name": "module-a",
  "version": "1.0.0",
  "private": true,
  "main": "index.js",
  "scripts": {
    "test": "echo \"Test passed in module-a\""
  }
}

пакеты / модуль-а / index.js

module.exports = () => console.log('Log in module-a');

пакеты / модуль-b / пакет.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"
  }
}

пакеты / модуль-b / import.test.js

const moduleA = require('module-a');

test('should import module-a', () => {
  moduleA();
});

lerna.json

{
  "npmClient": "yarn",
  "packages": [
    "packages/*"
  ],
  "version": "independent"
}

Наблюдение

Выполнение ссылки lerna --force-local делает не изменить статус-кво, тест по-прежнему не проходит, потому что module-b/node_modules/ по-прежнему не содержит ссылки на module-a.

Замечание

Я не могу использовать рабочие области yarn вместе с lerna, потому что module-b - это приложение Electron и конструктор электронов ожидает, что его зависимости будут установлены в папке packages/module-b/node_modules/.

Среда

  • lerna - версия 3.18.4
  • npm - версия 6.11.3
  • пряжа - версия 1.19.1
  • узел - версия v12.12.0
  • macOS Mojave 10.14.6

person matsev    schedule 18.11.2019    source источник
comment
Проголосуйте за это предложение, чтобы избежать путаницы с тегами.   -  person leonheess    schedule 10.02.2020


Ответы (2)


Я пробовал вашу реализацию.

Использование 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

person kitimenpolku    schedule 30.12.2019
comment
Другой способ - вручную поднять ваши внутрипакетные зависимости, добавив их в корневой package.json за lerna issue # 2352. В идеале это исправит PR # 2789. - person ericP; 04.01.2021

для меня он работал и установил пакеты в папке node_module

npx lerna exec -- npm install
person D V Yogesh    schedule 16.03.2020
comment
Я не верю, что это верное решение. это выполняет npm install для каждого пакета в репо, что занимает вечность и в этом нет необходимости. lerna bootstrap должен ссылаться на уже установленные пакеты. проблема в том, что иногда он не связывает зависимости зависимостей ... lerna link в конце моей команды начальной загрузки, похоже, исправляет это ... но я все еще проверяю ... - person K.H. B; 13.05.2020