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 :)
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
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
.
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 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.
Je ne pense pas qu'il existe une excellente solution compte tenu de vos contraintes, mais voici quelques éléments qui pourraient vous aider.
npm dedupe
pour optimiser la hiérarchie de votre répertoire, ce qui peut raccourcir certains cheminsnpm install --production
à installer sans les outils de développementnode_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
. 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.
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.
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.
J'ai trouvé une solution de Microsoft Node.js Guidelines .
> 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 versionnpm@3
qui tente de faire le node_modules
dossier hiérarchie au maximum plat. > npm install –g npm-windows-upgrade
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>
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.