В этой статье мы узнаем о разнице между package.json и package-lock.json.
package.json или package-lock.json?
пакет.json
- Он используется для установки пакетов в проекте Node.js.
- Это не только для установки зависимостей, но и для других целей, таких как определение свойств проекта, описание, информация об авторе и лицензии, сценарии для запуска через npm и т. д.
- Он сохраняет минимальную версию, необходимую приложению.
- Обновление пакетов с использованием
npm install
приведет к обновлению изменений, связанных с информацией о пакете, в package-lock.json, а не в package.json.
Примечание: вы можете прочитать https://techtalkbook.com/package -json-major-minor-and-patch-release, чтобы понять, как package.json используется для обновления пакетов новыми обновлениями.
пакет-lock.json
- Он используется исключительно для блокировки зависимостей для конкретной версии.
- Он сохраняет точную версию установленных пакетов, чтобы мы могли переустановить эти пакеты с точно такими же версиями.
Как создать package-lock.json?
- По умолчанию npm генерирует этот файл, когда мы запускаем
npm install
. (применимо для npm версии 5 или выше). - npm ниже версии 5 не создает этот файл по умолчанию, и его необходимо создать вручную, используя
npm shrinkwrap
какnpm-shrinkwrap.json
. - Если файл package-lock.json уже существует, команда npm обновит файл с обновленной информацией об установленном или обновленном пакете.
Можем ли мы отключить создание package-lock.json?
Да, можно выбрать, разрешать создание этого файла или нет.
- Установив
package-lock=false
в~/.npmrc
, можно разрешить команде npm не создаватьpackage-lock.json
. - Если этот параметр выполняется глобально в системе и требуется создать его для конкретного проекта, мы можем передать параметр
--package-lock
с помощью команды npm какnpm install --package-lock
внутри проекта.
Что делать, если файла package-lock.json нет?
В файле package.json символ вставки указывает на необходимость установки или обновления пакета до самой последней основной версии.
Например:
Предположим, что "grunt": "^0.1.3"
упоминается в файле package.json внутри проекта, и пакет уже установлен с этой версией.
Теперь, если будет доступно какое-либо новое обновление для этого пакета с версией 0.9.3
и если мы запустим npm install
, тогда пакет будет обновлен с версии 0.1.3
до 0.9.3
.
В приведенном выше случае, если package-lock.json не создан, это может создать проблему, если обновления с версией 0.9.3 имеют какие-либо функциональные проблемы, которые могут привести к поломке приложения.
Почему package-lock.json?
Короче говоря: package-lock.json используется, чтобы избежать различий в установленных зависимостях в разных средах и генерировать одинаковые результаты в каждой среде.
Давайте посмотрим подробнее, почему package-lock.json?
- Он используется для блокировки зависимости с установленными версиями, поэтому, когда кто-то настраивает приложение путем клонирования кодовой базы либо в локальной системе, либо во время миграции приложения, все ранее установленные пакеты будут установлены с теми же версиями и зависимостями.
- NPM устанавливает точные версии пакета, сохраненные в package-lock.json, и игнорирует символы
^
и~
из package.json, чтобы избежать установки последней/обновленной версии пакета, которая может нарушить работу приложения, если кодовая база приложения не совместим с обновленной версией пакетов. - Он содержит другую метаинформацию о пакетах, чтобы сэкономить время на получение этих данных из npm при установке любого пакета с помощью npm install.
- Это позволяет npm пропускать повторные разрешения метаданных для ранее установленных пакетов и, следовательно, оптимизирует процесс установки.
- Это позволяет видеть предыдущие состояния
node_modules
без фиксации самого каталога.
Заключение
По всем вышеперечисленным причинам мы всегда должны фиксировать package-lock.json с исходным кодом нашего проекта, чтобы при будущей установке приложения не устанавливались доступные более поздние версии, а устанавливались пакеты с версиями, записанными в package-lock. json.
Итак, теперь я думаю, вы поняли разницу между package.json и package-lock.json и использованием package-lock.json.
- Нужны ли нам и package-lock.json, и package.json?
Нет, нам не нужны оба, но теперь мы знаем, что может произойти, если у нас нет package-lock.json в нашей кодовой базе. - Нужен ли нам package.json?
Да, нам нужен package.json, это основной файл, который npm ищет во время установки пакета. - Можем ли мы иметь проект только с package-lock.json?
Нет, так как npm требуется package.json для установки пакета, только package-lock.json не будет работать, так как это просто ссылка для npm для поиска при установке пакетов с точными версиями для пакетов, упомянутых в package.json.
Я надеюсь, что вам понравилась эта статья и поможет вам решить ваши проблемы.
Посетите Techtalkbook, чтобы найти другие связанные темы.
Ссылки
- https://blog.logrocket.com/why-you-should-use-package-lock-json
- https://medium.com/@hossam.hilal0/package-json-vs-package-lock-json-vs-npm-shrinkwrap-json-33fcddc1521a
- https://stackoverflow.com/questions/46653833/is-there-a-way-to-force-npm-to-generate-package-lock-json
- https://dev.to/salothom/package-json-vs-package-lock-json-do-you-need-both-1mjf
Первоначально опубликовано на https://techtalkbook.com 29 декабря 2020 г.