Situation
Je souhaite utiliser gulp et les chaînes d'outils frontales associées dans les environnements de développement hébergés par Windows. Je me heurte à un mur en essayant d'utiliser des plug-ins gulp comme Browser-Sync, car le graphe du dossier node_modules se vide, rendant les chemins de fichiers Windows trop longs pour copier les fichiers. Je souhaite une approche pragmatique pour traiter ce problème dès maintenant sous Windows, indépendamment de ce que la communauté Node peut fournir ou non pour améliorer la convivialité de npm sur Windows à l'avenir.
2 questions
Existe-t-il un flux de travail npm pour Windows qui fonctionne exactement comme prévu? "lance la commande et installe les fichiers" (par exemple, comparable à npm sous OSX, npm sous Linux, Ruby gems ou même nuget) Je ne veux pas me mêler de modifications manuelles des fichiers , liens symboliques, etc. chaque fois que j'utilise npm sous Windows.
Existe-t-il un flux de travaux Cygwin stable et bien documenté pour l'exécution de npm et de nœuds permettant de contourner les limites de chemin d'accès aux fichiers de l'API Windows?
Gory détails énumérés ci-dessous ...
Problème général
Mon piratage actuel
Autres solutions de contournement peu agréables
Des liens symboliques peuvent être utilisés pour raccourcir les chemins d'accès aux fichiers, mais ce sont des piratages aléatoires. À mesure que l'écosystème npm se développe, les chaînes de dépendance imbriquées deviennent trop longues et cette solution de contournement devient inutilisable.
L'ajout de TOUTES les dépendances au fichier package.json du dossier racine a été mentionné dans un fil que j'ai rencontré. Bien que cette approche aplatisse la structure du dossier et empêche le chargement de modules en double, cette solution de contournement ne semble pas naturelle. Cela tue également la facilité d'utilisation, la durabilité et la productivité de npm, car vous devez manipuler les fichiers et les dossiers post-installation manuellement ou à l'aide de scripts malveillants. L'approche est également vulnérable au même sort que celui de l'approche des liens symboliques.
Le problème des dossiers profondément imbriqués sous Windows a été résolu pour la plupart à partir de la version npm 3.x
.
Selon npm:
.npm @ 3 rend l’installation "à plat au maximum" en soulevant tout ce qu’elle peut sur les node_modules de niveau supérieur. Cela signifie que la nidification n'a lieu que lors de conflits et qu'en tant que telle, les arbres ne doivent jamais être très profonds. En tant que tel, la limitation de la longueur du chemin Windows ne doit pas être utilisée.
Je viens d'installer npm 3.1.0
et l’essayé sur un paquet qui jetait le redouté The specified path, file name, or both are too long
Erreur.
Le problème est parti.
Vous pouvez obtenir les dernières versions de npm à partir d’ici: npm releases
Windows 8.1 et 10 ont une option pour augmenter la limite de chemin Win32:
Ceci est une solution de contournement.
Il existe des modules de nœuds qui aplatissent vos dépendances.
Les liens sont ici:
Ce que font ces modules peut aussi être fait manuellement. C’est la seule solution réelle qui existe à ce jour, c’est-à-dire que tous vos modules se trouvent à un même niveau, s’exigeant mutuellement, au lieu d’avoir des copies privées de leurs dépendances profondément imbriquées.
J'ai le même problème. L'aplatissement des dépendances n'est pas une solution complète, car vous utiliserez peut-être des modules qui dépendent de différentes versions du même module dépendant. J'ai découvert que le module gulp-run a cessé de fonctionner après l'aplatissement (lié aux hypothèses de module concernant les répertoires bin/.bin, je suppose). Drat!
Il y a beaucoup de discussions sur le problème, mais aucune solution n'est en vue: https://github.com/joyent/node/issues/696
https://github.com/npm/npm/issues/3697
Une solution de contournement qui fonctionne pour moi consiste à ajouter manuellement des dépendances dont mon projet n'a pas explicitement besoin.
Si vous voulez identifier les paquets qui vous posent des problèmes, j’ai trouvé PathLengthChecker très utile. Il suffit d'extraire le fichier EXE et d'exécuter l'interface graphique ou l'application de ligne de commande. L’autre façon dont j’ai découvert le problème est d’essayer de construire dans Visual Studio, mais cela échoue sans vous dire qui Le nom de répertoire est trop long.
Voici un exemple de solution de contournement en ligne de commande:
mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260
Je suis rentré:
261: C:\reallongdirectorywillbreakinwindows\node_modules\grunt-bower-tâche\node_modules\bower\node_modules\update-notifier\node_modules\latest-version\node_modules\package-json\no de_modules\registry-url\node_modules config-chain\readme.markdown
[Snip - ils étaient 12]
Selon la commande npm ls :
└─┬ [email protected]
├── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
Allons-y avec npmconf - c'est le conteneur pour tous les fichiers trop longs qui posent problème. Nous avons besoin de npmconf 2.1.1.
npm install --save-dev [email protected]
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s)
npm install
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260
Aucun résultat - tous les fichiers sont dans les limites!
L'avertissement évident ici est qu'il ne fonctionne qu'une seule fois par paquet: les dépendances sur différentes versions du même module ne peuvent pas être installées au niveau du noeud racine_modules car le noeud ne tient pas compte des versions de la structure de répertoires.
Cette solution de contournement n'est pas parfaite, mais elle résout mes objectifs principaux, qui consiste à faire fonctionner les nœuds sous Windows. Comme la résolution est conforme à package.json, la solution de contournement fonctionne pour les autres développeurs et permet de créer des serveurs sans fioritures ni manœuvres générales ni manuelles.
Allan -
À partir du numéro de github que vous avez lié,
npm ajoutera par défaut dedupe-at-install-time. Ceci est bien plus réalisable que le changement de système de modules de Node, mais ce n’est pas encore tout à fait trivial, et implique de retravailler en profondeur certains modèles enracinés depuis longtemps.
C'est (enfin) actuellement en préparation chez npm, sous le nom de multi-stage-install
, et est ciblé pour npm@3
. npm
responsable du développement Forrest Norvell va passer du temps à s'exécuter sous Windows au cours de la prochaine année. Créez donc des problèmes liés à Windows sur le suivi des problèmes npm
< https://github.com/npm/npm/issues >
Si vous êtes d'accord pour l'installer globalement, cela pourrait être une solution:
Vous pouvez ajuster le chemin où npm installe les modules globaux sur quelque chose de très court (généralement c:\utilisateurs\{nom d'utilisateur}\AppData\Roaming\npm\npm_modules) qui prend déjà beaucoup de caractères.
Pour l'ajuster, voir ici: Changer le répertoire d'installation global par défaut pour les modules node.js sous Windows?
Si vous l’ajustez, par exemple, c:\n \, dans certains cas, cela pourrait résoudre le problème.
Dans les fenêtres:
C:\scotchbox/public/gulpProject
cmd
et appuyez sur Enternpm install
C'est ce qui a finalement été résolu pour moi ...
Après avoir installé gulp et reçu des erreurs, lancez ... gulp
Quand vous voyez un paquet échouer, installez-le manuellement avec --no-bin-link
.
Sudo npm install {package} --no-bin-link
Où {package} est le package qui rencontre des problèmes.
Après tout cela, je recevais une erreur dans le plugin 'gulp-notify' Message: introuvable: notify-send.
Cela était dû à un problème de plugin avec Vagrant. Vous pouvez soit désactiver les notifications ..
export DISABLE_NOTIFIER=true;
Ou installez le plugin avec Vagrant .
Bonne chance. J'ai passé beaucoup de temps là-dessus, même après avoir suivi les recommandations de nombreuses personnes.
Brandon
npm install --no-bin-link
. Vous aurez un entier aplatinode_modules