Когда, если вообще, NPM восстановит зависимости, опубликованные после зависимого пакета? - PullRequest
0 голосов
/ 05 января 2019

Предположим, что все ссылки в 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 с флагом глубины, однако я не нахожу записи, которую я сделал это в packages.json, так как C не указан в A packages.json.

1 Ответ

0 голосов
/ 05 января 2019

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

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

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

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

...