Имеет ли смысл указывать в package.json конкретные (фиксированные) версии пакетов, если есть package-lock.json?
Как в случае с автором вопроса Для чего нужен package-lock.json?, от одного только чтения документации мне не стало ясно, зачем нужен package-lock.json. Несколько лет я просто тупо следовал рекомендации, что данный файл надо отслеживать с помощью системы контроля версий, но что касается организации версий устанавливаемых зависимостей, то я всегда ставил конкретные версии, а не диапазоны, например:
{
"private": "true",
"dependencies": {
"@nestjs/common": "9.0.7",
"@nestjs/core": "9.0.7",
"@nestjs/platform-express": "9.0.7",
"@nestjs/typeorm": "9.0.0"
}
}
вместо
{
"private": "true",
"dependencies": {
"@nestjs/common": "^9.0.7",
"@nestjs/core": "^9.0.7",
"@nestjs/platform-express": "^9.0.7",
"@nestjs/typeorm": "^9.0.0"
}
}
потому что так было как-то спокойнее, особенно при работе в команде.
Но всё-таки так не годится - надо понимать, что и зачем я делаю, а потому встаёт вопрос: имеет ли смысл в принимаемых мной мерах версионной безопасности (установка конкртных версий) , если суещствует package-lock.json?
Ответы (1 шт):
Смысл в установке конкретных версий есть.
Т.к. из lock будет браться версия, только если сделать npm install, а если сделать npm update, то тогда обновится версия в npm.json и перезапишется новое значение в npm.lock
Также, вдруг, если нет SVN, то при потере lock и инсталяции ПО - будет браться уже версия, как если бы сделали npm update
Если случайно кто-то удалит npm.lock и сделает install/update опять же беспокоиться о том, что установится версия на самый крохотный минор - тоже не придётся.
Ещё бывает даже так, что самый минорный апдейт может поломать сайт. Да, вроде миноры, вроде фиксы, но (на собственном опыте было) даже, условно при апдейте версии с 2.2.1 на 2.2.2 - ломало всё.
Также, с учётом например текущей ситуации в мире, мы например зафиксировали все версии до 24 фервраля. Т.к после 24 февраля в некоторых репозиториях началась жесть (особенно в VUE где разраб одного из расширений внедрил код, который делал rm -rf в системе).