Я столкнулся с любопытной проблемой - видимо, в некотором Node.js модуле есть глубокие иерархии папок, что команда копирования Windows (или PowerShell Copy-Item
), которую мы фактически используем ) попадает в печально известную ошибку "путь слишком долго", когда длина пути превышает 250 символов.
Например, это иерархия папок, которую может создать один модуль Node:
node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
Кажется безумным, но это реальность с модулями Node.
Нам нужно использовать copy-paste во время развертывания (мы не используем "умную" целевую платформу, такую как Heroku, где возможно развертывание Git), и это серьезное ограничение для Windows.
Нет ли команды npm или что-то, что бы скомбинировать папку node_modules
или, возможно, включать только то, что действительно необходимо во время выполнения? (Node обычно содержат папки test
и т.д.). которые нам не нужно разворачивать.) Любые другие идеи, как обойти это? К сожалению, не использовать Windows, к сожалению, не вариант:)
Ответ 1
npm v3 (выпущенный недавно) решает эту проблему, сглаживая зависимости. Проверьте примечания к выпуску здесь в https://github.com/npm/npm/releases/tag/v3.0.0 в разделе flat flat
.
И последний комментарий по этому вопросу https://github.com/npm/npm/issues/3697
Ответ 2
просто чтобы добавить к этому... еще одна вещь, которая помогла мне, заключалась в том, чтобы выводить все установленные модули с помощью npm ls
.
который даст вам дерево модулей и версий... оттуда довольно легко определить, какие из них являются дубликатами... npm dedupe
ничего не сделал для меня. Я не уверен, что эта ошибка или что (Node v 10.16)
Итак, как только вы идентифицируете дублирующий модуль, установите его в корневой каталог node_module с помощью npm install dupemodule@1.2.3 --save-dev
. Важная версия.
после этого я уничтожил каталог node_modules и сделал новый npm install
.
Краткая версия
-
npm ls
, чтобы получить список всех установленных модулей.
- просмотрите эти модули и определите дублирующие модули (важна версия)
-
npm install module@version --save-dev
, чтобы установить эти модули в корневой каталог node_modules и обновить package.json.
-
rmdir node_modules
, чтобы удалить каталог node_modules.
-
npm install
, чтобы вытащить новую копию ваших зависимостей.
Как только я это сделал, все было намного чище.
Я также рекомендую комментировать файл package.json, чтобы показать, какие из них были сбиты, чтобы сгладить дерево node_modules.
Ответ 3
Я не думаю, что есть большое решение с учетом ваших ограничений, но вот некоторые вещи, которые могут помочь.
- Попробуйте использовать
npm dedupe
для оптимизации иерархии каталогов, которая может сократить некоторые пути.
- Используйте
npm install --production
для установки без средств разработки.
- Возьмите некоторые из этих глубоко вложенных зависимостей (достаточно, чтобы избежать проблемы, я предлагаю) и переместите их в каталог node_modules верхнего уровня. Просто следите за ними, чтобы вы знали, какие ваши истинные зависимости и какие обходные пути для этой проблемы.
- ИЛИ переместите некоторые из этих глубоких зависимостей в самый высокий каталог
node_modules
в разделе your_project/node_modules/pkg_with_deep_deps
, который позволит им иметь достаточно короткие пути, но все же работать. Таким образом, это будет your_project/node_modules/pkg_with_deep_deps/node_modules
.
- Я думаю, что
require
должен иметь возможность правильно находить их во время выполнения. Вам просто нужно четко документировать, что вы изменили вручную, почему вы это сделали, и сохраните свои собственные истинные зависимости, точно представленные в package.json
Вот обсуждение проблемы github, в котором подробно рассматривается эта проблема.
Ответ 4
Я написал модуль node, называемый "npm-flatten", который выравнивает ваши зависимости для вас здесь: https://www.npmjs.org/package/npm-flatten
Если вы ищете дистрибутив, я также написал пакет NuGet, который будет интегрировать полную среду node.js с вашим проектом .NET здесь: http://www.nuget.org/packages/NodeEnv/
Обратная связь будет приветствоваться.
Ответ 5
Что-то, что помогло мне, - это сопоставить локальный диск с моей папкой Node.js:
net use n:\computername\c $\ users\myname\documents\ node.js/persistent: yes
До: c:\users\myname\documents\node.js\имя_проекта (45 символов)
После: n:\projectname (14 символов, что меньше 31 символа)
Во многих случаях это позволяло устанавливать некоторые модули.
Я скажу, что я только что обнаружил эту проблему сегодня, когда пытался копировать весь свой код на USB-накопитель.
"C:\Users\MyName\Documents\node.js\angular -phonecat\ node_modules\карма\node_modules\сторож\node_modules\AnyMatch\node_modules\MicroMatch\node_modules\regex-cache\node_modules\benchmarked\node_modules\file-reader\node_modules\extend-shallow\benchmark\fixtures слишком длинный.
Даже когда я пытался создать резервную копию этих файлов с использованием буквы N:, в некоторых случаях она по-прежнему не срабатывала из-за длины пути, но этого было достаточно, чтобы исправить одно выше.
Ответ 6
1) Во время сборки релиза вы можете запретить Visual Studio сканировать эти файлы/папку, установив свойства папки как скрытую папку (просто установите ее на node_modules).
Справка:
http://issues.umbraco.org/issue/U4-6219#comment=67-19103
2) Вы можете исключить файлы или папку, опубликованные во время упаковки, включив в файл CsProject XML node.
<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>
Ответ 7
Я нашел одно решение из Microsoft Node.js Guidelines.
- Начните с короткого пути (например, c:\src)
-
> npm install -g rimraf
удалять файлы, превышающие max_path
-
> npm dedupe
перемещает дубликаты пакетов на верхний уровень
-
> npm install -g flatten-packages
перемещает все пакеты на верхний уровень, но может вызвать проблемы с версиями.
- Перейдите к
npm@3
, который пытается сделать иерархию папок node_modules
максимально плоской.
- Корабли с Node v5
- Или...
> npm install –g npm-windows-upgrade
Ответ 8
Это не правильное решение, а работа вокруг, когда вы торопитесь, но вы можете использовать 7-Zip для zip вашу папку, переместите заархивированный файл и разархивируйте его без каких-либо проблем.
Мы использовали это решение для развертывания приложения Node.js, где было невозможно выполнить чистую установку npm.