Как правильно работать с lerna и локальными зависимостями?
Я настроил два модуля в монорепозитории для использования lerna с локальной зависимостью. Я ожидал этого
$ lerna bootstrap
$ lerna run test
будет достаточно, чтобы загрузить все внешние зависимости, связать локальную зависимость, выполнить и пройти все тесты во всех модулях.
Ожидаемое поведение
Согласно документации lerna bootstrap:
- Свяжите вместе все пакеты 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)
Действия по воспроизведению
- Создайте структуру папок ниже
- Скопируйте встроенные файлы в соответствующий каталог.
- Выполнить
$ 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