2013-04-11 2 views
5

Я устанавливал несколько пакетов узлов, и я заметил, что NPM создает кучу дубликатов.Диспетчер пакетов узлов (NPM), похоже, дает дублированные пакеты

Например, я впервые установил мангуст, который, естественно, установил связку зависимостей. Затем я установил пакет mongodb, который также пришел с bson как зависимость. Из-за перекрытия зависимостей, у меня есть следующие аномалии:

MongoDB присутствует в следующих каталогах:

/usr/local/lib/node_modules/mongodb/ 
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/ 

Кроме того, BSON, зависимость от MongoDB присутствует в обоих из них:

/usr/local/lib/node_modules/mongodb/ 
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/ 

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

/usr/local/lib/node_modules/[something1]/node_modules/[something2]/node_modules/[something3/.../.../node_modules/[somethingX]/ 

В этом случае указанная [зависимость] может присутствовать на уровнях X в/usr/local/lib/node_modules.

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

Не было бы проще просто поместить все прямо в/usr/local/lib/node_modules /, а затем перекрестные ссылки?

ответ

3

Проблема заключается в том, что mongoose только кодируется для работы с say v1 mongodb, и вы закодировали приложение для работы с v2 mongodb - как таковое, оно устанавливает и загружает обе версии, чтобы все это работало. Мы можем сделать это легко в узле, поскольку требуемый способ модуля не загрязняет глобальное пространство имен, в отличие от браузера, что делает управление и включение правильных зависимостей королевской болью из-за глобального загрязнения пространства имен.

Теперь, если пакет package.json и mongoose package.json позволяют использовать ту же версию mongodb (вы можете указать конкретную версию или диапазоны), то при выполнении rm -Rf node_modules; npm install будет установлена ​​только одна копия mongodb, а не две. Однако, как говорилось ранее, если указано несколько версий, будут установлены и загружены несколько версий.

+0

Не создает ли это суетливую иерархию после того, как вы установили кучу разных модулей и начали кучу разных проектов? Есть ли способ запустить рекурсивное обновление с помощью NPM? – zcserei

+0

Предоставление людям кодирования крошечных модулей, которые в один прекрасный день будут закончены, а не большие модули, которые будут постоянно обновляться, будет установлена ​​только одна копия модуля. Таким образом, оказывается, что на самом деле это не так уж и много, поскольку большинство модулей узлов являются крошечными, а если нет, то они некоторое время слушают подстановку (James Halliday - http://substack.net/) и то убеждайтесь в том, чтобы принять крошечную философию тоже :) Некоторое время назад я разместил некоторые мысли по этой точной проблеме: https://gist.github.com/balupton/5308717, возможно, это поможет, мне потребовались годы, чтобы прийти к это также :) – balupton

+0

'if [both] ... разрешить ту же [] версию ... будет устанавливать только одну копию' Почему это не так? У меня есть частный случай, когда нужно использовать только одну копию, но устанавливаются несколько копий, и это занимает очень много времени, потому что ... ну, я не уверен, почему, но каждый экземпляр занимает довольно много времени для установки! – Michael

Смежные вопросы