Вузлові npm-файли у файлах Windows задовгі для встановлення пакетів


89

Ситуація

Я хочу використовувати gulp та пов'язані з ними інтерфейсні ланцюжки інструментів у середовищах розробки, розміщених у Windows. Я б’юся об стіну, намагаючись скористатися додатковими модулями, такими як Browser-Sync, оскільки графік папок node_modules роздуває, роблячи шляхи файлів Windows занадто довгими для копіювання файлів. Я хотів би прагматичного підходу до вирішення цієї проблеми прямо зараз у Windows, незалежно від того, що може надавати спільнота Node, а що не надавати для поліпшення зручності використання npm у Windows у майбутньому.

2 запитання

  1. Чи існує робочий процес npm для Windows, який працює просто так, як було задумано? "запустити команду та встановити файли" (наприклад, порівняно з npm на OSX, npm на Linux, ruby ​​gems або навіть nuget). npm у Windows.

  2. Чи існує добре задокументований, стабільний робочий процес Cygwin для виконання npm і вузлів, щоб обійти обмеження шляху до файлу Windows API?

Деталі Горі, перелічені нижче ...

Загальна проблема

  • Запуск інсталяції npm із стандартного командного рядка Windows не вдається виконати глибоко вкладені ієрархії node_modules.
  • Відповідно до потоку репозиторію github Joyent, це визнана проблема, яка не має приємних обхідних шляхів для розробників у середовищах, орієнтованих на Windows. ( Справді? )
  • Ядро NT підтримує шлях до файлу довжиною до 32 767 символів.
  • MAXPATH Windows API обмежується 260 символами.
  • Windows API обробляє файлові операції для всіх основних оболонок Windows і не тільки, включаючи: Explorer, CMD, Powershell, MYSgit bash тощо ( MS насправді? Як давно існує NTFS? )
  • Cygwin підтримує довгі шляхи до файлів, але npm.cmd не працює нестандартно через форматування crlf. Я спробував перетворення DOS2Unix на npm, щоб він працював із Cygwin, але, схоже, з цим виникають інші проблеми.

Мій поточний хак

  • Створіть папку "n" як проміжну область у кореневій папці C: \, оскільки це скорочує шлях до моєї папки.
  • Запустіть npm всередині папки "n", щоб встановити модулі для того, що мені потрібно.
  • Запустіть Cygwin і використовуйте cp для копіювання папки node_modules у цільовий проект.
  • Полоскати і повторювати, коли залежності змінюються або коли мені потрібно закрутити новий проект.

Інші неприємні обхідні шляхи

Символічні посилання можна використовувати для скорочення шляху до файлів, але це важкі хакі. У міру зростання екосистеми npm вкладені ланцюжки залежностей стануть занадто довгими, і це обхідне рішення стане непридатним.

Додавання ВСІХ залежностей до файлу package.json кореневої папки було згадано в одному потоці, з яким я зіткнувся. Хоча такий підхід згладить структуру папок і запобіжить завантаженню повторюваних модулів, цей обхідний шлях здається неприродним. Це також вбиває зручність використання, довговічність та продуктивність npm, оскільки вам доведеться возитися з файлами та папками після встановлення вручну або за допомогою деяких хакі-скриптів. Цей підхід також вразливий до тієї самої долі, яку з часом може зазнати підхід до символічних посилань.


Я майже думав, що це вирішено. Я змусив Cygwin працювати з npm, запустивши dos2unix util для наступних 2 файлів: npm.cmd та npm
Allan McLemore

Обмеження шляху Windows API роблять npm непридатним, оскільки деякі модулі npm використовують Visual Studio для створення файлів. Це помилка, яку я отримую при синхронізації браузера з npm: C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5): помилка MS B3491: Може не писати рядки у файл "Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate". Вказаний шлях, ім'я файлу або обидва вони занадто довгі. Повна назва файлу повинна містити менше 260 символів, а назва каталогу повинна бути менше 248 символів.
Allan McLemore

У мене може бути підхід "таффі-тягне", щоб завантажити модулі вузлів, завантажені npm у вікна. Він включає кілька раундів наступного: встановлення npm, виведення npm, зменшення npm та модулі node_rm -r. Неодноразові дії, здається, певною мірою загладжують довгі шляхи до файлів, але це як би витягування таффі (наприклад, не робиться, поки не закінчиш). Хто-небудь кодифікував це або написав автоматизований інструмент, щоб зробити це більш під ключ?
Allan McLemore

Говорячи про "хакі-сценарії", я написав такий, який, на мою думку, НЕ ЖАХЛИВО хакі. Я створив інструмент під назвою fenestrate, за допомогою якого ви можете програмно згладити структуру каталогів ваших модулів після встановлення. Ви можете встановити його як загальний гачок після встановлення npm.
zetlen

2
@yoneal Для особистого використання та для швидкого початку роботи, fenestrate повинен рекурсивно проходити папку node_modules, тому вам не потрібно запускати її вручну на глибоких залежностях. Однак було б чудово розгалужити ці залежності - я думаю, що багато розгалужених модулів з простими конфігураціями fenestrate послали б чудове повідомлення супровідникам npm.
zetlen

Відповіді:


58

Проблема з глибоко вкладеними папками в Windows в основному була вирішена, починаючи з версії npm 3.x.

За даними npm:

.npm @ 3 робить встановлення "максимально рівним", піднімаючи все, що можна, до вузлів_модулів верхнього рівня. Це означає, що гніздування відбувається лише під час конфліктів, і тому дерева не повинні заглиблюватися дуже глибоко. Таким чином, обмеження довжини шляху Windows не повинно траплятися.

Я щойно встановив npm 3.1.0і випробував його на пакунку, який видавав страшну The specified path, file name, or both are too longпомилку.

Проблема зникла.

Ви можете отримати найновіші збірки npm звідси: випуски npm


4
Я також мав успіх з оновленням npm 3.x на машині Windows. Безсоромна вилка: я написав статтю про npm 3 на Windows triplet.fi/blog/…
Tx3

21

У Windows 8.1 та 10 є можливість збільшити обмеження шляху Win32:

  • Відкрити редактор групової політики (натисніть Windows+ Rі введіть gpedit.mscі натисніть Enter)
  • Перейдіть до наступного каталогу: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • Двічі клацніть на опції Увімкнути довгі шляхи Win32 і ввімкніть її.

введіть тут опис зображення


опція була недоступна для мене, і, до речі, я перейшов з win 7 pro, тому це можлива причина
Еван Моррісон,

@EvanMorrison "Файлова система \ NTFS \ Увімкнути довгі шляхи NTFS" було перейменовано на "Файлова система \ Увімкнути довгі шляхи Win32" у наступних збірках win10. Я оновив відповідь для подальшого використання.
Марсело Мейсон,

1
будь-яка ідея для Win Server 2012 R2
sairfan

12

Це обхідне рішення.

Є кілька вузлових модулів, які вирівнюють ваші залежності для вас.
Посилання тут:

Те, що роблять ці модулі, також можна зробити вручну. Це єдине реальне рішення, яке існує на сьогоднішній день, тобто мати всі свої модулі на одному рівні, вимагаючи один одного, замість того, щоб усі мали глибоко вкладені приватні копії своїх залежностей.


10
Я виявив, що пакети flatten добре документовані та прості у використанні.
StriplingWarrior

3

Аллан -

З випуску github, який ви зв’язали,

npm за замовчуванням додасть час виведення під час встановлення. Це набагато доцільніше, ніж зміна системи модулів Node, але це все ще не зовсім тривіально, і передбачає багато переробок деяких давно укорінених шаблонів.

Це (нарешті) наразі працює в npm, multi-stage-installйдеться за назвою і призначене для npm@3. npmПровідний розробник Форест Норвелл витратить деякий час на роботу в Windows у новому році, тому, будь ласка, створіть проблеми, пов’язані з Windows, у програмі npmвідстеження проблем < https://github.com/npm/npm/issues >


3

У мене те саме питання. Згладження залежностей не є повним рішенням, оскільки ви можете використовувати модулі, які залежать від різних версій одного і того ж залежного модуля. Я виявив, що модуль запуску перестав працювати після згладжування (я думаю, це стосується припущень модуля щодо каталогів bin / .bin). Драт!

Існує багато дискусій щодо проблеми, але рішення не видно: https://github.com/joyent/node/issues/6960

https://github.com/npm/npm/issues/3697

Обхідне рішення, яке працює для мене, - це вручну додавати залежності, які моєму проекту явно не потрібні.

Якщо ви хочете визначити, які пакети доставляють вам проблеми, я знайшов PathLengthChecker досить корисним. Просто витягніть EXE і запустіть графічний інтерфейс або програму командного рядка. Інший спосіб, я розкрив проблему, - це спробувати побудувати у Visual Studio, але це не вдається, не сказавши вам, яке саме ім'я каталогу занадто довге.

Ось приклад командного рядка мого обхідного шляху:

mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

Я повернувся:

261: C: \ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ registry-url \ node_modules \ npmmodf \ node config-chain \ readme.markdown

[сніп - їх було 12]

Відповідно до команди npm ls :

└─┬ grunt-bower-task@0.4.0
  ├── async@0.1.22
  ├─┬ bower@1.3.12
  │ ├─┬ update-notifier@0.2.0
  │ │ ├─┬ latest-version@0.2.0
  │ │ │ └─┬ package-json@0.2.0
  │ │ │   └─┬ registry-url@0.1.1
  │ │ │     └─┬ npmconf@2.1.1
  │ │ │       ├─┬ once@1.3.1
  │ │ │       │ └── wrappy@1.0.1

Давайте підемо з npmconf - це контейнер для всіх надмірних файлів, які викликають проблеми. Нам потрібен npmconf 2.1.1.

npm install --save-dev npmconf@2.1.1
(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

Результатів немає - усі файли в межах!

Очевидним застереженням є те, що він працює лише один раз на пакет - залежності від різних версій одного модуля не можуть бути встановлені на кореневому рівні node_modules, оскільки вузол не враховує версії в структурі каталогів.

Цей обхідний шлях не ідеальний, але він вирішує мої основні цілі роботи вузлів у Windows, і оскільки роздільна здатність є правильною в package.json, обхідний шлях працює для інших розробників та створює сервери без будь-яких ручних або глобальних суєт.


2

Якщо ви в порядку з глобальною установкою, це може бути вирішенням:

Ви можете налаштувати шлях, де npm встановлює глобальні модулі, до чогось дуже короткого (зазвичай це:), c:\users\\{username}\AppData\Roaming\npm\npm_modulesщо вже займає багато символів.

Щоб його налаштувати, дивіться тут: Змінити глобальний каталог встановлення за замовчуванням для модулів node.js у Windows?

Якщо ви налаштуєте його, наприклад, c:\n\у деяких випадках це може вирішити проблему.


1

Це, нарешті, це виправило для мене ...

Після встановлення gulp і отримання помилок запустіть ... gulp

Коли помітите, що пакет не працює, встановіть його вручну за допомогою --no-bin-link.

sudo npm install {package} --no-bin-link

Де {пакет} - це пакет, який має проблеми.

Після всього цього я отримав помилку в плагіні 'gulp-notify' Повідомлення: не знайдено: notify-send.

Це було пов’язано з проблемою плагіна для Vagrant. Ви можете вимкнути сповіщення ..

export DISABLE_NOTIFIER=true;

Або встановіть плагін за допомогою Vagrant .

Удачі .. Я довго витрачав на це, навіть дотримуючись багатьох рекомендацій людей.

Брендон


0

У вікнах:

  1. За допомогою провідника Windows перейдіть до спільної папки бродяги (я, до речі, використовую скотчбокс), наприклад C:\scotchbox/public/gulpProject
  2. В адресному рядку папки введіть cmdі натиснітьEnter
  3. Зробіть залпову установку npm install

1
Уникайте копіювання тієї самої відповіді . Натомість слід позначити як копію. Крім того, не лайтеся своїм постом.
Tunaki

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.