web-dev-qa-db-fra.com

Comment empêcher les node_modules imbriqués dans node_modules

J'ai créé mon propre paquet npm, appelons-le XYZ, il a @material-ui dépendance dans son package.json fichier.

Lorsque je l'installe dans le projet A, j'ai imbriqué node_modules dans le dossier XYZ (c'est donc A\node_modules\XYZ\node_modules\@material-ui), mais lorsque je l'installe dans le projet B, je n'ai pas de dossier node_modules imbriqué. Les projets A et B ont tous deux @material-ui dans leurs package.json fichiers avec les mêmes versions.

Comment forcer mon package XYZ à utiliser @material-ui de A\node_modules?

11
Jacoslaw

Il y a des avantages à avoir moins de dossiers imbriqués et des inconvénients à avoir plus de dossiers dans le dossier node_modules directement et des problèmes de contrôle de version.

Utiliser la bonne version npm

Corriger yarn et npm (ie: npm v3) ne devrait pas avoir un tel problème de structure. Il doit toujours aplatir toute la structure lorsque cela est possible et avoir des nœuds_modules imbriqués uniquement si les versions sont incompatibles avec celle du haut.

Vérifier les versions

Donc, si vous le faites fonctionner correctement sur un projet et non sur un autre, c'est probablement dû à la version. Vérifiez si le @material-ui est la même version sur les deux. Peut-être que deux packages différents sont en conflit à un moment donné.

Vérifiez comment vous les installez

D'après votre question, il est dit que c'est la même version. Cependant, vous n'avez pas mentionné comment vous avez installé votre package sur les deux projets. Si vous installez avec yarn link ou npm link il devrait installer les dépendances correctement comme prévu.

Vérifiez si vous utilisez des packages différents

Si vous vérifiez le package, récemment material-ui est obsolète et l'avis indique de passer à @material-ui/core au lieu. Il se peut que certains packages dans ce dossier ne soient pas identiques. Quoi qu'il en soit, c'est comme ça chaque fois qu'il y a un conflit de dépendance. Vérifiez à l'intérieur du @material-ui dossier.

Aplatissez-les manuellement (dangereux)

Il existe plusieurs packages pour résoudre ce problème avec force. Ils iront à travers les dossiers node_modules imbriqués et les aplatiront en un seul dossier.

flatten-packages

  • Installer avec, npm install -g flatten-packages.
  • Exécutez l'exécutable flatten-packages pour réorganiser tous les packages dans le dossier node_modules du répertoire du projet.
  • Aplatir supprimera l'ancienne version d'un package. Vous devez prendre soin des erreurs liées aux changements de version.
13
Md. Abu Taher

Vous pouvez utiliser la commande npm dedupe Pour accomplir cela.

Vous pouvez placer la commande dans le script postinstall dans package.json, Et chaque fois que NPM installe le package, la commande npm dedupe Aplatit pour vous tous les packages dupliqués dans la même version.

Pour plus d'informations, voir https://docs.npmjs.com/cli/dedupe

script de post-installation npm

1
RaynorChan

J'ai eu le même problème dans une application React Native avec mon package NPM. Le problème était que dans le projet A, la version de React Native utilisée était (0,59. 5) en dessous de la version utilisée dans mon package (0.59.8). Installer le package dans un tout nouveau projet (B), bien sûr, utilisait la dernière version de React Native à ce moment-là, c'était la même chose de mon paquet (0.59.8).

0
kudo44