Node npm пути к файлам Windows слишком длинны для установки пакетов

Ситуация

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

2 вопроса

  • Есть ли рабочий процесс npm для Windows, который работает так, как он был предназначен? "запустить команду и установить файлы" (например, сопоставимо с npm на OSX, npm на Linux, рубиновые камни или даже на nuget). Я не хочу возиться с кучей ручных изменений файлов, символических ссылок и т.д. каждый раз, когда я использую npm в Windows.

  • Существует ли хорошо документированный стабильный рабочий процесс Cygwin для выполнения npm и Node для обхода ограничений на пути к файлу Windows API?

Сведения о Gory, перечисленные ниже...

Общая проблема

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

My Current Hack

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

Другие неприступные временные решения

Символические ссылки могут использоваться для сокращения путей к файлам, но это kludgy hacks. По мере роста экосистемы npm вложенные сети зависимостей становятся слишком длинными, и это обходное решение становится непригодным.

Добавление всех зависимостей в файл корневой папки package.json было упомянуто в одном потоке, с которым я столкнулся. Хотя этот подход сгладит структуру папок и предотвратит загрузку дублирующих модулей, это обходное решение кажется неестественным. Он также убивает удобство использования, долговечность и производительность npm, потому что вам приходится возиться с файлами и папками после установки вручную или с помощью некоторых хакерских скриптов. Этот подход также уязвим к той же судьбе, что и подход Symbolic Links может в конечном итоге пострадать.

Ответ 1

Проблема с глубоко вложенными папками в Windows была решена в основном с версии npm 3.x.

Согласно npm:

.npm @3 делает установку "максимально плоской", поднимая все, что может, на верхний уровень node_modules. Это означает, что вложенность происходит только при конфликтах, и поэтому деревья никогда не должны быть очень глубокими. Таким образом, ограничение длины пути к окну не должно выполняться.

Я только что установил npm 3.1.0 и попробовал его на пакете, который бросал ужасную ошибку The specified path, file name, or both are too long.

Проблема исчезла.

Вы можете получить последние версии npm: выпуски npm

Ответ 2

В Windows 8.1 и 10 есть возможность увеличить ограничение пути Win32:

  • Откройте редактор групповой политики (нажмите Windows + R, введите gpedit.msc и нажмите Enter)
  • Перейдите в следующий каталог: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • Дважды нажмите на параметр "Включить длинные пути Win32 " и включите его.

enter image description here

Ответ 3

Это решение для работы.

Есть несколько модулей node, которые выравнивают ваши зависимости для вас.
Ссылки здесь:

То, что делают эти модули, может быть сделано вручную. Это единственное реальное решение существует на данный момент, то есть иметь все ваши модули на одном уровне, требуя друг друга, вместо того, чтобы все личные копии их зависимостей были глубоко вложены.

Ответ 4

Аллан -

Из связанного вами вопроса github,

npm по умолчанию добавит значение dedupe-at-install-time. Это значительно более возможно, чем изменение модульной системы Node, но она по-прежнему не совсем тривиальна и включает в себя много переработок некоторых давно укоренившихся шаблонов.

Это (наконец) в настоящее время работает в npm, идя по имени multi-stage-install и нацеливается на [email protected]. npm лидер в области разработки Forrest Norvell собирается потратить некоторое время на работу в Windows в новом году, поэтому, пожалуйста, создайте связанные с Windows проблемы в npm https://github.com/npm/npm/issues >

Ответ 5

У меня такая же проблема. Сглаживание зависимостей не является полным решением, поскольку вы можете использовать модули, которые зависят от разных версий одного и того же зависимого модуля. Я обнаружил, что модуль gulp -run перестает работать после сглаживания (я подозреваю, что это связано с предположениями модуля о каталогах bin/.bin). Убирайся!

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

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

Обходной путь, который работает для меня, - это вручную добавить зависимости, которые явно не нужны моему проекту.

Если вы хотите определить, какие пакеты дают вам проблемы, я нашел PathLengthChecker весьма полезным. Просто извлеките EXE и запустите приложение GUI или командной строки. Другой способ, которым я обнаружил проблему, - попытаться построить в 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\last-version\node_modules\package-json\нет de_modules \-реестра URL\node_modules\npmconf\node_modules\конфиг-цепь\readme.markdown

[snip - их было 12]

В соответствии с командой npm ls:

└─┬ [email protected]
  ├── [email protected]
  ├─┬ [email protected]
  │ ├─┬ [email protected]
  │ │ ├─┬ [email protected]
  │ │ │ └─┬ [email protected]
  │ │ │   └─┬ [email protected]
  │ │ │     └─┬ [email protected]
  │ │ │       ├─┬ [email protected]
  │ │ │       │ └── [email protected]

Отпустите npmconf - это контейнер для всех файлов избыточной длины, которые вызывают проблемы. Нам нужно 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

Нет результатов - все файлы находятся в пределах!

Очевидная оговорка здесь заключается в том, что она работает только один раз для каждого пакета. Зависимости от разных версий одного и того же модуля не могут быть установлены на уровне root node_modules, поскольку node не учитывает версии в структуре каталогов.

Это обходное решение не является совершенным, но оно решает мои основные задачи: node работать с Windows, а так как это разрешение в пакете. json, обходной путь работает для других разработчиков и создает серверы без каких-либо ручных или глобальных возня.

Ответ 6

Если вы согласны с его глобальной установкой, это может быть обходной путь:

Вы можете настроить путь, в котором npm устанавливает глобальные модули, на что-то очень короткое (обычно это: c:\users\\{username}\AppData\Roaming\npm\npm_modules), которое уже занимает много символов.

Чтобы настроить его, см. здесь: Изменить глобальный установочный каталог по умолчанию для модулей node.js в Windows?

Если вы настроите его, например, на c:\n\, в некоторых случаях это может решить проблему.

Ответ 7

Это то, что окончательно исправило его для меня...

После установки gulp и получения ошибок запустите... gulp

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

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

Где {package} - пакет, который имеет проблемы.

После всего этого я получал сообщение об ошибке в плагине 'gulp -notify' Message: not found: notify-send.

Это было связано с проблемой плагина с Vagrant. Вы можете отключить уведомления.

export DISABLE_NOTIFIER=true;

Или установите плагин с Vagrant.

Желаем удачи.. Я долгое время занимался этим, даже после того, как последовали многие рекомендации для людей.

Brandon

Ответ 8

В окнах:

  • Используя проводник Windows, перейдите к своей общей папке (я использую scotchbox кстати), например C:\scotchbox/public/gulpProject
  • В адресной строке папки введите cmd и нажмите Enter
  • Сделайте установку gulp npm install

Ответ 9

npm install --no-bin-link. У вас будет весь сплющенный node_modules