В чем разница между npm-shrinkwrap.json и package-lock.json? - программирование
Подтвердить что ты не робот

В чем разница между npm-shrinkwrap.json и package-lock.json?

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

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

npm install [email protected] -g

И теперь, если a npm-shrinkwrap.json найден во время:

npm install

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

npm WARN read-shrinkwrap This version of npm
is compatible with [email protected],
but npm-shrinkwrap.json was generated for [email protected]
I'll try to do my best with it!

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

Но почему для него существует новый формат? Что может сделать package-lock.json, что npm-shrinkwrap.json не может?

4b9b3361

Ответ 1

Файлы имеют одинаковое содержимое, но есть несколько различий в том, как обрабатывает их npm, описанный на сайте docs, а также в файл docs в репире npm, который начинается с явной адресации разницы между этими двумя файлами:

  • package-lock.json никогда не публикуется в npm, тогда как npm-shrinkwrap по умолчанию
  • package-lock.json файлы, которые не находятся в пакете верхнего уровня, игнорируются, но сохраняются файлы с укороченным слоем, принадлежащие зависимостям
  • 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 года, обратная совместимость будет становиться все менее и менее важной, чем дальше мы получаем с этой даты, так как большинство людей в конечном итоге обновится.)
  • Если вы публикуете свой пакет до числа нпм, у вас есть выбор между:

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


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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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