Quelle est la bonne façon de travailler avec lerna et les dépendances locales?
J'ai configuré deux modules dans un référentiel mono pour utiliser lerna avec une dépendance locale. Je m'attendais à ce que
$ lerna bootstrap
$ lerna run test
serait suffisant pour télécharger toutes les dépendances externes, lier une dépendance locale et exécuter et passer tous les tests dans tous les modules.
Selon la documentation lerna bootstrap :
- Symlink ensemble tous les packages Lerna qui sont des dépendances les uns des autres.
Ainsi, je m'attendais à ce que lerna bootstrap
créerait un lien symbolique dans module-b/node_modules
en dessous de cela indique module-a
(qui permettrait alors aux tests d'être exécutés et réussis).
Aucune liaison ne se produit, ce qui entraîne l'échec des tests:
lerna ERR! test d'exécution de fil terminé 1 dans lerna ERR 'module-b'! yarn run test stdout: yarn run v1.19.1 $ jest info Visitez https://yarnpkg.com/en/docs/cli/run pour la documentation sur cette commande.
lerna ERR! test de fil d'exécution stderr: FAIL ./import.test.js ● La suite de tests n'a pas pu s'exécuter
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
suivi par $ 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"
}
L'exécution de lerna link --force-local ne change pas le statu quo, le test échoue toujours car le module-b/node_modules/
ne contient toujours pas de référence à module-a
.
Je ne peux pas utiliser espaces de travail de fil avec lerna car module-b
est une application Electron et le générateur d'électrons s'attend à ce que ses dépendances soient installées dans packages/module-b/node_modules/
dossier.
J'ai essayé votre implémentation.
En utilisant file:../module-a
dans packages/module-b/package.json
ne fonctionne pas pour moi.
Vous pouvez le contourner facilement en écrivant un numéro de version pour module-a
(peu importe qui puisque nous allons 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"
}
}
A l'origine de votre projet:
Bootstrap et lien pour la version locale:
npx lerna bootstrap --force-local
Exécutez les tests:
npx lerna run test
pour moi, cela a fonctionné et installé les packages dans le dossier node_module
npx lerna exec -- npm install