2016-10-01 2 views
1

Система управления зависимостями Gradle хранит загруженные артефакты в локальном кэше Maven. Когда сборка запрашивает эту же зависимость снова, зависимость просто извлекается из кеша, избегая любой сетевой передачи артефакта.Кэширование NPM, аналогичное локальному кэшу Maven

Я пытаюсь воспроизвести это поведение с помощью NPM для создания проектов JavaScript. Я ожидал, что NPM будет поддерживать глобальный кеш node_modules, но установка пакета «глобально» в NPM имеет другое значение => пакет добавляется в PATH, чтобы он мог использоваться как инструмент CLI.

Чтение документации для npm install, стандартное поведение - установить пакеты в локальный каталог node_modules. Но это означало бы много дублированных пакетов в системе, теряющих ценное дисковое пространство. Это также создает проблему для создания чистых производственных сборок, так как в идеале node_modules следует сдувать каждый раз.

Поддерживает ли NPM что-то вроде кэширования Maven Gradle? Документация на NPM cache не дает понять, как это будет использоваться. Более того, неясно, безопасна ли стратегия кэширования с помощью NPM в нескольких параллельных сборках.

Это похоже на такое основное требование для занятых сред CI, которое должно быть разрешено ранее. Я нашел инструмент npm-cache, который, кажется, предлагает эту поддержку, но было бы намного лучше, если бы кеширование поддерживалось изначально в npm.

Спасибо!

ответ

1

КПП NPM уже comes bundled with NPM out of the box (перечисленные ниже cli commands). И его главная утилита - избежать сетевой передачи одного и того же пакета снова и снова.

Что касается выпуска дубликатов пакетов, то с npm v3 было an effort in terms of finding ways to deduplicate dependencies. Но он по-прежнему не работает точно так же, как Gradle, поскольку в вашей node_modules папке все равно возможно дублировать один и тот же пакет.

Per NPM documentation:

Ваша структура node_modules каталога и поэтому ваше дерево зависимостей зависит от установки порядка

Хотя свежий npm install из того же пакета JSON всегда производит такое же дерево зависимостей:

Команда установки npm при использовании исключительно для установки пакета возраста от apackage.json, всегда будет производить одно и то же дерево. Это связано с тем, что порядок установки из package.json всегда в алфавитном порядке. Такой же порядок установки означает, что вы получите одно и то же дерево.

Таким образом, по крайней мере, существует способ получения согласованных деревьев зависимостей, хотя нет никакой гарантии, что он будет наиболее эффективным. По крайней мере, эти различия do not interfere correct functioning of NPM.

Надеюсь, что это поможет.

+0

Это именно поведение этого кэша, который я пытаюсь понять. Например, чистая установка на моем компьютере создает каталог node_modules размером ~ 3 ГБ, но каталог кэша .npm составляет всего ~ 120 МБ. Так что здесь происходит? Является ли npm не кэшированием всего? Я не могу найти это поведение документированным или объясненным в любом месте. – Boon

+0

Хотя NPM пытается дедуцировать зависимости, он не гарантирует полную дедупликацию. Таким образом, благодаря рекурсивному характеру вы можете получить больше копий одного и того же пакета в своем дереве зависимостей. И, следовательно, закончите с более крупной папкой 'node_modules', чем ваш кеш. – fmello

+0

Сказав это, я согласен, что прыжок с 120 Мбайт до 3 ГБ кажется большим. Можете ли вы подтвердить, что ваша версия npm равна 3+? Я уезжаю от своего dev env на выходные. Но если вы разместите образец своего 'package.json', я был бы рад запустить образец для вас и сравнить результаты. – fmello

0

IMHO Жаль, что создатели не учились на таких вещах, как maven, которые уже были там.Если вы выполняете микросервисы и имеете много приложений на своем компьютере, и у вас также может быть несколько филиалов или локальных jenkins, у вас будет каждая зависимость N * M раз на диске, что является исключительной потерей дискового пространства и производительности. Поэтому вы должны знать, что Java или .NET/C# являются зрелыми экосистемами, в то время как экосистема JavaScript все еще находится в детстве с большим количеством недостатков и краев. Но JavaScript развивается быстро, поэтому позволяет надеяться на лучшее. Не стесняйтесь обсуждать свою боль с производителями npm (https://github.com/npm/npm/issues/).

Однако частичное излечение наступает, если ты уйдешь от НОГО и перейти на пряжу: http://yarnpkg.com/

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