Як розгорнути додаток Node.js із глибокою структурою node_modules у Windows?


91

Я зіткнувся з цікавою проблемою - очевидно, у деяких модулях 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папку або, можливо, включати лише те, що насправді потрібно під час виконання? (Вузлові модулі зазвичай містять testпапки тощо, які нам не потрібні для розгортання.) Будь-які інші ідеї, як їх обійти? Не користуватися Windows, на жаль, не можна :)


1
У вашому проекті є комплект package.jsonз dependenciesнабором? Якщо так, чи можете ви скопіювати без node_modulesвикористання npm installабо updateзалежностей?
Джонатан Лоновський,

4
@JonathanLonowski Наше середовище розгортання не підтримує виконання npm installв цільовому середовищі, воно працює, створюючи "пакет розгортання" локально (в основному ZIP та деякі метадані), який потім завантажується на цільову машину, витягується там і все. Тож мені потрібно включити node_modulesбезпосередньо.
Борек Бернард

Відповіді:


24

npm v3 (нещодавно випущений) вирішує цю проблему, вирівнюючи залежності. Перевірте примітки до випуску тут, https://github.com/npm/npm/releases/tag/v3.0.0, у flat flatрозділі.

І останній коментар з цього питання https://github.com/npm/npm/issues/3697


5
Нотатки до випуску flat flatтепер поховані на іншій сторінці. Ось пряме посилання: github.com/npm/npm/releases/tag/v3.0.0
Джон-Філіп

Дякую @ John-Philip, оновив відповідь новим посиланням
RameshVel

62

просто щоб додати до цього ... ще одна річ, яка мені допомогла, - це перелік усіх встановлених модулів npm ls.

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

Отже, як тільки ви визначите повторюваний модуль, встановіть його в кореневий каталог node_module за допомогою npm install dupemodule@1.2.3 --save-dev. Важлива версія.

після цього я знищив каталог node_modules і зробив нове npm install.

Коротка версія

  1. npm ls щоб отримати список усіх встановлених модулів.
  2. переглянути ці модулі та визначити копії модулів ( версія важлива )
  3. npm install module@version --save-dev щоб встановити ці модулі в кореневій директорії node_modules та оновити package.json.
  4. rmdir node_modules видалити каталог node_modules.
  5. npm install витягти свіжу копію ваших залежностей.

Як тільки я це зробив, все стало набагато чистішим.

Я також рекомендую прокоментувати ваш файл package.json, щоб показати, які з них були знищені, щоб згладити дерево node_modules.


Для мене це чудово працювало. Дякую! Пробачте за незнання, але чому модулі не завжди встановлюються на вищому рівні?
Калеб

2
@Caleb, мабуть, тому, що різні модулі покладаються на різні версії одного модуля, або, можливо, просто тому, що простіше просто отримати все, що потрібно, а потім врахувати це ... Не знаю.
Ben Lesh

7
Незважаючи на це, дякую за підказку. Я просто здув близько 1700 дублікатів файлів з нашого проекту. Видалення речей - це моя улюблена частина роботи розробником! Крім того, для тих, хто шукає, як додати коментарі до package.json, ось ваша відповідь: stackoverflow.com/questions/14221579/…
Калеб,

github.com/joyent/node/issues/6960 хлопець із вузла каже, що Windows є першокласним громадянином. Вони сказали. Але вони закрили проблему і нічого не виправили. Щасливі користувачі Windows.
ве

38

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

  • Спробуйте використовувати 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, яке детально розробляє цю проблему.


Дякуємо, що вказали dedupe(зовсім не знали про це) та --production( npm install -hне показали цю опцію)! На жаль, використання архіву ZIP - це не варіант, див. Коментар вище.
Борек Бернард

9
Виведення npm лише згладить "загальні" модулі до найнижчого загального місця в ієрархії. Не досить добре. Правильне рішення дозволить "змусити" всю ієрархію і, можливо, дозволить ігнорувати каталоги test / doc. Альтернативою може бути вузол для підтримки читання модулів безпосередньо з файлу tar.
MMind

3
Погоджено, якийсь "двійковий" розподіл пакетів (ZIP, tarball, що завгодно) буде дуже корисним.
Борек Бернард

11

Я написав модуль вузла під назвою "npm-flatten", який згладжує ваші залежності для вас тут: https://www.npmjs.org/package/npm-flatten

Якщо ви шукаєте сповіщення, я також написав пакет NuGet, який буде інтегрувати повне середовище node.js з вашим проектом .NET тут: http://www.nuget.org/packages/NodeEnv/

Зворотній зв'язок буде вітатися.


Це спрацювало для нас. У нас були ще кращі результати, коли ми першими запустили nmp dedup.
Шон Роуан,

1

Щось, що мені допомогло, було зіставити локальний диск з моєю папкою Node.js:

net use n: \ ім'я комп'ютера \ c $ \ users \ myname \ documents \ node.js / persistent: так

До: c: \ users \ myname \ documents \ node.js \ projectname (45 символів) Після: n: \ projectname (14 символів, що на 31 символ менше)

У багатьох випадках це дозволяло встановлювати деякі модулі.

Скажу, що я щойно знову виявив цю проблему, коли намагався зробити резервну копію всього коду на USB-накопичувачі.

"C: \ Users \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node_modules \ file-reader \ node_modules \ extension-shallow \ benchmark \ світильники занадто довгі. "

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


1

1) Під час побудови випуску Ви можете запобігти скануванню Visual studio цих файлів / папок, встановивши властивості папки як Прихована папка (ПРОСТО встановіть для node_modules). Посилання: http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) Ви можете виключити файли або папки, які публікуються під час упаковки, включивши наступний вузол XML у файл CsProject.

<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>

1

Я знайшов одне рішення з Керівництва Microsoft Node.js .

  • Почніть з короткого шляху (наприклад, 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

0

Це не належне рішення, це швидше вирішення проблеми, коли ви поспішаєте, але ви можете використовувати 7-Zip щоб заархівувати вашу папку, перемістити заархівований файл і розпакувати його без будь-яких проблем.

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


Так. Це те, що я роблю щоразу, коли мені потрібно встановити мангуст. У ньому є власний код, і я маю кілька / новіші версії Visual Studio = не вдається. Я міг просто відкрити VS, внести кожен невдалий файл .sln і зробити його відновленим. Але простіше просто XCOPY переглядати весь мій набір папок node_modules \ mongoose за необхідності (звичайно, перегляд версій).
Майкл Бланкеншип
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.