91 votes

Comment déployer une application Node.js avec une structure node_modules profonde sous Windows ?

J'ai rencontré un curieux problème - apparemment, certains modules Node.js ont si profond les hiérarchies de dossiers que la commande de copie de Windows (ou la commande de PowerShell Copy-Item qui est ce que nous utilisons actuellement) rencontre la fameuse erreur "path too long" lorsque le chemin est long de plus de 250 caractères.

Par exemple, voici une hiérarchie de dossiers qu'un seul module Node peut créer :

node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...

Cela semble insensé mais c'est une réalité avec les modules Node.

Nous devons utiliser le copier-coller pendant le déploiement (nous n'utilisons pas une plateforme cible "intelligente" comme Heroku où le déploiement par Git serait une option) et c'est une limitation sérieuse sous Windows.

Il n'y a pas une commande npm ou quelque chose qui permettrait de compacter le fichier node_modules ou peut-être n'inclure que ce qui est réellement nécessaire au moment de l'exécution ? (Les modules de nœuds contiennent généralement test dossiers etc. que nous n'avons pas besoin de déployer). Avez-vous d'autres idées pour contourner ce problème ? Ne pas utiliser Windows n'est malheureusement pas une option :)

62voto

Ben Lesh Points 39290

Juste pour ajouter à cela... une autre chose qui m'a aidé était de lister tous les modules installés avec npm ls .

ce qui vous donnera un arbre de modules et de versions... à partir de là, il est assez facile d'identifier ceux qui sont en double... npm dedupe n'a rien fait pour moi. Je ne suis pas sûr si c'est un bug ou quoi (Node v 10.16)

Donc, une fois que vous avez identifié un module dupliqué, installez-le dans le répertoire Root node_module en utilisant npm install dupemodule@1.2.3 --save-dev . La version est importante.

après cela, j'ai effacé mon répertoire node_modules et fait un nouveau npm install .

Version courte

  1. npm ls pour obtenir une liste de tous les modules installés.
  2. examiner ces modules et identifier les modules en double ( la version est importante )
  3. npm install module@version --save-dev pour installer ces modules dans le répertoire Root node_modules et mettre à jour le package.json.
  4. rmdir node_modules pour supprimer le répertoire node_modules.
  5. npm install pour obtenir une nouvelle copie de vos dépendances.

Une fois que j'ai fait ça, tout était beaucoup plus propre.

Je vous recommande également de commenter votre fichier package.json pour montrer quels sont ceux qui ont été descendus pour aplatir l'arbre node_modules.

38voto

Peter Lyons Points 47794

Je ne pense pas qu'il y ait de grande solution compte tenu de vos contraintes, mais voici quelques éléments qui pourraient vous aider.

  • Essayez d'utiliser npm dedupe pour optimiser la hiérarchie de vos répertoires, ce qui peut raccourcir certains chemins.
  • Utilisez npm install --production à installer sans les outils de développement
  • Prenez certaines de ces dépendances profondément imbriquées (juste assez pour éviter le problème, je suggère) et déplacez-les vers le répertoire node_modules de niveau supérieur. Gardez-en la trace afin de savoir quelles sont vos véritables dépendances et quelles sont les solutions de contournement de ce problème.
  • OU déplacer certaines de ces dépendances profondes vers le niveau le plus élevé. node_modules sous your_project/node_modules/pkg_with_deep_deps qui leur permettra d'avoir des chemins assez courts tout en fonctionnant. Ce serait donc your_project/node_modules/pkg_with_deep_deps/node_modules .
    • Je pense require devrait être capable de les trouver correctement au moment de l'exécution. Vous devrez juste documenter clairement ce que vous avez modifié manuellement, pourquoi vous l'avez fait, et garder vos propres dépendances réelles représentées avec précision dans le fichier package.json

Voici une discussion sur un problème github qui traite de ce problème en détail.

24voto

RameshVel Points 24472

Npm v3 (publié récemment) résout ce problème en aplatissant les dépendances Consultez les notes de version ici dans https://github.com/npm/npm/releases/tag/v3.0.0 sous flat flat section.

Et le dernier commentaire sur cette question https://github.com/npm/npm/issues/3697

11voto

user3602171 Points 71

J'ai écrit un module node appelé "npm-flatten" qui aplatit vos dépendances pour vous ici : https://www.npmjs.org/package/npm-flatten

Si vous cherchez une solution de rechange, j'ai également écrit un paquet NuGet qui intègre un environnement node.js complet à votre projet .NET ici : http://www.nuget.org/packages/NodeEnv/

Les commentaires sont les bienvenus.

1voto

Quelque chose qui m'a aidé a été de mapper un lecteur local à mon dossier Node.js :

utilisation nette n : \computername\c $ \users\myname\documents\node.js /persistant:oui

Avant : c : \users\myname\documents\node.js\projectname (45 caractères) Après : n : \projectname (14 caractères, soit 31 caractères de moins)

Dans de nombreux cas, cela a permis d'installer certains modules.

Je dois dire que j'ai redécouvert ce problème aujourd'hui alors que je tentais de sauvegarder tout mon code sur une clé USB.

" C:\Users\myname\Documents\Node.js\angular -phonecat \node_modules\karma\node_modules\chokidar\node_modules\anymatch\node_modules\micromatch\node_modules\regex -cache \node_modules\benchmarked\node_modules\file -lecteur \node_modules\extend -shallow \benchmark\fixtures est trop longue."

Même lorsque j'ai essayé de les sauvegarder en utilisant la lettre de lecteur N :, cela a échoué dans certains cas en raison de la longueur des chemins, mais c'était juste suffisant pour résoudre le cas ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X