web-dev-qa-db-fra.com

Comment déployer l'application Node.js avec une structure node_modules profonde sur Windows?

J'ai rencontré un problème curieux - apparemment, certains modules Node.js ont donc profondes hiérarchies de dossiers cette commande de copie Windows ( ou Copy-Item de PowerShell, qui est ce que nous utilisons réellement), frappe l'infâme erreur "chemin trop long" lorsque le chemin fait plus de 250 caractères.

Par exemple, il s'agit d'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 fou, 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 plate-forme cible "intelligente" comme Heroku où le déploiement de Git serait une option) et c'est une sérieuse limitation sur Windows.

N'existe-t-il pas une commande npm ou quelque chose qui pourrait compacter le dossier node_modules Ou peut-être inclure uniquement ce qui est réellement nécessaire au moment de l'exécution? (Les modules de nœuds contiennent généralement des dossiers test, 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 :)

91
Borek Bernard

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. sous flat flat section.

Et le dernier commentaire sur ce problème https://github.com/npm/npm/issues/3697

24
RameshVel

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

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

Donc, une fois que vous avez identifié un module en double, installez-le dans le répertoire racine node_module en utilisant npm install [email protected] --save-dev. La version est importante.

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

Version courte

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

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

Je recommande également de commenter votre fichier package.json pour montrer lesquels ont été supprimés pour aplatir l'arborescence node_modules.

62
Ben Lesh

Je ne pense pas qu'il existe une excellente 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 votre répertoire, ce qui peut raccourcir certains chemins
  • Utilisation 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 dans le répertoire node_modules de niveau supérieur. Gardez simplement une trace d'eux pour savoir quelles sont vos véritables dépendances et quelles sont les solutions de contournement pour ce problème.
  • OU déplacez certaines de ces dépendances profondes vers la plus haute node_modules répertoire sous your_project/node_modules/pkg_with_deep_deps qui leur permettra d'avoir des chemins assez courts mais tout de même de fonctionner. Ce serait donc your_project/node_modules/pkg_with_deep_deps/node_modules.
    • Je pense que require devrait être capable de les trouver correctement au moment de l'exécution. Vous aurez juste besoin de documenter clairement ce que vous avez modifié manuellement, pourquoi vous l'avez fait, et de garder vos propres véritables dépendances représentées avec précision dans package.json

Voici une discussion sur le problème avec Github qui développe ce problème en détail.

38
Peter Lyons

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

Si vous recherchez une distrubtion, j'ai également écrit un package NuGet qui intégrera un environnement node.js complet avec votre projet .NET ici: http://www.nuget.org/packages/NodeEnv/ =

Une rétroaction serait la bienvenue.

11
user3602171

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

Net Use n:\computername\c $\users\myname\documents\node.js/persistent: 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 l'installation de certains modules.

Je dirai que je viens de redécouvrir ce problème aujourd'hui lorsque j'essayais 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-reader node_modules\extend-shallow\benchmark\fixtures est trop long. "

Même lorsque j'ai essayé de les sauvegarder à l'aide de la lettre de lecteur N: il a toujours échoué dans certains cas en raison de la longueur des chemins, mais c'était juste suffisant pour corriger celui ci-dessus.

1

J'ai trouvé une solution de Microsoft Node.js Guidelines .

  • Commencez par un chemin court (par exemple c:\src)
  • > npm install -g rimraf supprimer les fichiers qui dépassent max_path
  • > npm dedupe déplace les packages en double vers le niveau supérieur
  • > npm install -g flatten-packages déplace tous les packages au niveau supérieur, mais peut entraîner des problèmes de version
  • Mettre à niveau vers npm@3 qui tente de faire le node_modules dossier hiérarchie au maximum plat.
    • Livré avec Node v5
    • Ou… > npm install –g npm-windows-upgrade
1
zangw

1) Pendant la génération de la version, vous pouvez empêcher Visual Studio d'analyser ces fichiers/dossier en définissant les propriétés du dossier en tant que dossier caché (JUSTE le définir sur node_modules) . Référence: http://issues.umbraco.org/issue/U4-6219#comment=67-191

2) Vous pouvez exclure des fichiers ou des dossiers qui sont publiés lors de l'empaquetage en incluant le nœud XML suivant dans le fichier CsProject.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <OutputPath>bin\</OutputPath>
   <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
  <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>
1
David Chelliah

Ce n'est pas une solution appropriée, mais plutôt une solution lorsque vous êtes pressé, mais vous pouvez utiliser 7-Zip pour compresser votre dossier, déplacer le fichier compressé et décompresser sans aucun problème.

Nous avons utilisé cette solution pour déployer une application Node.js où il n'était pas possible de faire une installation npm propre.

0
Jason