J'ai rencontré un problème curieux - apparemment, certains modules Node.js ont des hiérarchies de dossiers si profondes que la commande de copie de Windows (ou PowerShell, Copy-Item
qui est ce que nous utilisons réellement) rencontre la tristement célèbre erreur "chemin trop long" lorsque le chemin est supérieur à 250 caractères longs.
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 limitation sérieuse sur Windows.
N'existe-t-il pas une commande npm ou quelque chose qui compacterait le node_modules
dossier ou n'inclurait peut-être que ce qui est réellement nécessaire au moment de l'exécution? (Les modules de nœud contiennent généralement des 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 :)
package.json
avecdependencies
? Si tel est le cas, pouvez-vous copier sansnode_modules
et utiliser npm versinstall
ouupdate
les dépendances?npm install
dans l'environnement cible, il fonctionne en créant un "package de déploiement" localement (essentiellement un ZIP plus quelques métadonnées) qui est ensuite téléchargé sur la machine cible, extrait là-bas et c'est tout. J'ai donc besoin d'inclurenode_modules
directement.Réponses:
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 la
flat flat
section.Et le dernier commentaire sur ce numéro https://github.com/npm/npm/issues/3697
la source
flat flat
sont maintenant enterrées dans une autre page. Voici un lien direct: github.com/npm/npm/releases/tag/v3.0.0juste pour ajouter à cela ... une autre chose qui m'a aidé a été 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 des doublons ...
npm dedupe
n'a rien fait pour moi. Je ne sais pas si c'est un bogue 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 j'ai fait un nouveau
npm install
.Version courte
npm ls
pour obtenir une liste de tous les modules installés.npm install module@version --save-dev
pour installer ces modules dans le répertoire racine node_modules et mettre à jour package.json.rmdir node_modules
pour supprimer le répertoire node_modules.npm install
pour extraire une nouvelle copie de vos dépendances.Une fois que j'ai fait cela, tout était beaucoup plus propre.
Je recommande également de commenter votre fichier package.json pour montrer ceux qui ont été supprimés pour aplatir l'arborescence node_modules.
la source
Je ne pense pas qu'il y ait de bonne solution compte tenu de vos contraintes, mais voici quelques éléments qui pourraient vous aider.
npm dedupe
pour optimiser votre hiérarchie de répertoires, ce qui peut raccourcir certains cheminsnpm install --production
pour installer sans les outils de développementnode_modules
répertoire le plus élevé sousyour_project/node_modules/pkg_with_deep_deps
ce qui leur permettra d'avoir des chemins suffisamment courts tout en fonctionnant. Donc ce seraityour_project/node_modules/pkg_with_deep_deps/node_modules
.require
devrait être en mesure 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 conserver vos propres dépendances réelles représentées avec précision danspackage.json
Voici une discussion sur la question github qui développe ce problème en détail.
la source
dedupe
(je ne savais pas du tout à ce sujet) et--production
(npm install -h
n'a pas montré cette option)! L'utilisation d'une archive ZIP n'est malheureusement pas une option, voir un commentaire ci-dessus.J'ai écrit un module de nœud appelé "npm-flatten" qui aplatit vos dépendances pour vous ici: https://www.npmjs.org/package/npm-flatten
Si vous cherchez une distribution, j'ai également écrit un package NuGet qui intégrera un environnement node.js complet à votre projet .NET ici: http://www.nuget.org/packages/NodeEnv/
Les commentaires seraient les bienvenus.
la source
Quelque chose qui m'a aidé a été 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 d'installer 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 \ mon nom \ 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 en utilisant la lettre de lecteur N:, cela échouait toujours dans certains cas en raison de la longueur du chemin, mais c'était juste assez pour corriger celui ci-dessus.
la source
1) Pendant la construction de la version, vous pouvez empêcher Visual Studio de scanner ces fichiers / dossiers en définissant les propriétés du dossier en tant que dossier caché (il suffit de le définir sur node_modules). Référence: http://issues.umbraco.org/issue/U4-6219#comment=67-19103
2) Vous pouvez exclure des fichiers ou des dossiers publiés lors de l'empaquetage en incluant le nœud XML suivant dans le fichier CsProject.
la source
J'ai trouvé une solution de Microsoft Node.js lignes directrices .
> npm install -g rimraf
supprimer les fichiers qui dépassentmax_path
> npm dedupe
déplace les packages en double vers le niveau supérieur> npm install -g flatten-packages
déplace tous les packages vers le niveau supérieur, mais peut entraîner des problèmes de versionnpm@3
laquelle tente de rendre lanode_modules
hiérarchie des dossiers au maximum plate.> npm install –g npm-windows-upgrade
la source
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 le 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.
la source