С выпуском из npm@5теперь будет записан package-lock.json, если npm-shrinkwrap.json уже не существует.

Я установил npm@5 глобально через:

npm install npm@5 -g

А теперь, если npm-shrinkwrap.json обнаружен во время:

npm install

будет напечатано предупреждение:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

Итак, мой вывод состоит в том, что я должен заменить термоусадочную пленку на package-lock.json.

А зачем ему новый формат? Что может package-lock.json, чего npm-shrinkwrap.json не может?

Ответы (4)

Файлы имеют точно такое же содержимое, но есть несколько различий в том, как npm обрабатывает их, большинство из которых указано на страницах документации для package-lock.json и npm -shrinkwrap.json:

  • package-lock.json никогда не публикуется в npm, тогда как npm-shrinkwrap по умолчанию
  • package-lock.json файлы, не входящие в пакет верхнего уровня, игнорируются, но файлы shrinkwrap, принадлежащие зависимостям, соблюдаются
  • npm-shrinkwrap.json обратно совместим с npm версий 2, 3 и 4, тогда как package-lock.json распознается только npm 5 +

Вы можете преобразовать существующий package-lock.json в npm-shrinkwrap.json, запустив npm shrinkwrap.

Таким образом:

  • Если вы не публикуете свой пакет в npm, выбор между этими двумя файлами не имеет большого значения. Вы можете использовать package-lock.json, потому что это значение по умолчанию, и его имя более понятно начинающим npm; в качестве альтернативы вы можете использовать npm-shrinkwrap.json для обратной совместимости с npm 2-4, если вам сложно гарантировать, что все в вашей команде разработчиков используют npm 5+. (Обратите внимание, что npm 5 был выпущен 25 мая 2017 года; обратная совместимость будет становиться все менее и менее важной по мере удаления от этой даты, поскольку большинство людей в конечном итоге обновится.)

  • Если вы публикуете свой пакет в npm, у вас есть выбор между:

    1. с использованием package-lock.json, чтобы точно записать, какие версии зависимостей вы установили, но позволяя людям, устанавливающим ваш пакет, использовать любую версию зависимостей, которая совместима с диапазонами версий, продиктованными вашим package.jsonили
    2. с использованием npm-shrinkwrap.json, чтобы гарантировать, что каждый, кто устанавливает ваш пакет, получит в точности одну и ту же версию всех зависимостей


    Официальная точка зрения, описанная в документации, заключается в том, что для библиотек следует использовать вариант 1 (предположительно, чтобы уменьшить количество дублирования пакетов, вызванное тем, что многие зависимости пакета зависят от немного разных версий одного и того же вторичного сервера). dependency), но этот вариант 2 может быть разумным для исполняемых файлов, которые будут установлены глобально.

Я думаю, что идея заключалась в том, чтобы --save и shrinkwrap работали по умолчанию, но избегали любых потенциальных проблем, связанных с shrinkwrap там, где это не нужно. Итак, они просто дали ему новое имя файла, чтобы избежать конфликтов. Кто-то из npm объяснил это более подробно здесь:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

Соответствующая цитата:

npm по умолчанию публикует большинство файлов в исходном каталоге, а люди годами издают термоусадочную пленку. Мы не хотели нарушить совместимость. С --save и shrinkwrap по умолчанию было велик риск того, что он случайно попадет и распространится через реестр, и в основном дает нам возможность обновлять deps и дедупликация ... null.

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

Пояснение от разработчика NPM:

Идея определенно состоит в том, чтобы package-lock.json был последним и Лучшее в технологии термоусадочной упаковки, и npm-shrinkwrap.json должен быть зарезервировано для тех немногих драгоценных людей, которые очень заботятся об их библиотеках, имеющих точный node_modules - и для людей кто хочет, чтобы CI использовал npm @> = 2 для установки определенного дерева без чтобы поднять его версию npm.

Новый файл блокировки ("package-lock.json") разделяет в основном все тот же код, тот же формат, что и npm-shrinkwrap (вы можете переименовать их между собой!). Это также то, что кажется сообществу поймите: "у него есть файл блокировки", кажется, нажимается намного быстрее с люди. Наконец, наличие нового файла означало, что у нас могло быть относительно обратная совместимость с низким уровнем риска с термоусадочной пленкой без необходимости делать странные такие вещи, как разрешение-публикация, упомянутые в родительском посте.

package-lock.json * версии 100003 * гарантированы только с npm ci (, поскольку npm install перезаписывает package-lock.json, если есть конфликт с package.json).

npm-shrinkwrap.json версии гарантированы как с npm ci, так и с npm install.

2022 WebDevInsider