Когда, если вообще, NPM восстановит зависимости, опубликованные после зависимого пакета?

Предположим, что все ссылки в package.json: ^1.0.0, и я только поднимаю версию патча.

У меня есть A, зависящий от B, зависящий от C: A > B > C. Я восстанавливаю A и замечаю, что версия CI get публикуется после B. Я ожидал, что последняя версия C , опубликованная до восстановления B, будет восстановлена, но я фактически получил версию C, опубликованную после B.

Затем я опубликовал бессодержательный патч C и попытался обновить A, ожидая увидеть новую версию C. Однако ничего не изменилось; Версия C, восстановленная с помощью A, была той же версией, которую я получил до того, как опубликовал новую версию C.

Итак, учитывает ли NPM время публикации пакетов при восстановлении зависимостей вида ^1.0.0?


Начиная с npm@2.6.1, обновление npm будет проверять только пакеты верхнего уровня. Предыдущие версии npm также рекурсивно проверяли все зависимости. Чтобы получить старое поведение, используйте npm --depth 9999 update.

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

Однако это все еще не объясняет, почему версия C, опубликованная после B, была синхронизирована в первую очередь; При первой синхронизации, даже если я не передал флаг глубины, NPM должен восстановить все зависимости. Какую политику он применяет во время этой начальной синхронизации?

Теперь, если я удалю node_modules папка и запустить npm install Я постоянно получаю новую версию C. Как будто npm вспомнил, что я ранее запускал npm update с флагом глубины, однако я не нахожу записи о том, что сделал это в packages.json, поскольку C не указан в файле packages.json.

1 ответ

Поведение npm имеет больше смысла, если я предполагаю, что его дизайнеры пытались сократить сетевой трафик до npm.org.

npm install > v2.6.1 будет по возможности удовлетворять косвенные зависимости с использованием кэша, даже если на npm.org были опубликованы более поздние удовлетворительные версии; npm install не будет проверять, есть ли недавно опубликованные версии кэшированных пакетов.

Существует два способа заставить npm проверять сервер на наличие последних версий пакетов: (1) использовать --depth 9999 или (2) удалите кеш, используя npm cache clear --froce,

Я думаю npm publish должен локально кэшировать новый пакет...

Другие вопросы по тегам