Как развернуть приложение Node.js с глубокой структурой node_modules в Windows?

Я столкнулся с любопытной проблемой - видимо, в некотором 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, к сожалению, не вариант:)

Ответ 2

просто чтобы добавить к этому... еще одна вещь, которая помогла мне, заключалась в том, чтобы выводить все установленные модули с помощью npm ls.

который даст вам дерево модулей и версий... оттуда довольно легко определить, какие из них являются дубликатами... npm dedupe ничего не сделал для меня. Я не уверен, что эта ошибка или что (Node v 10.16)

Итак, как только вы идентифицируете дублирующий модуль, установите его в корневой каталог node_module с помощью npm install [email protected] --save-dev. Важная версия.

после этого я уничтожил каталог node_modules и сделал новый npm install.

Краткая версия

  • npm ls, чтобы получить список всех установленных модулей.
  • просмотрите эти модули и определите дублирующие модули (важна версия)
  • npm install [email protected] --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 перемещает все пакеты на верхний уровень, но может вызвать проблемы с версиями.
  • Перейдите к [email protected], который пытается сделать иерархию папок node_modules максимально плоской.
    • Корабли с Node v5
    • Или... > npm install –g npm-windows-upgrade

Ответ 8

Это не правильное решение, а работа вокруг, когда вы торопитесь, но вы можете использовать 7-Zip для zip вашу папку, переместите заархивированный файл и разархивируйте его без каких-либо проблем.

Мы использовали это решение для развертывания приложения Node.js, где было невозможно выполнить чистую установку npm.