Мы используем DeployHQ для создания и развертывания нескольких наших приложений. Он просто настроен и работает просто отлично. Однако несколько дней назад мы столкнулись с проблемой — и я хочу поделиться решением.

На момент написания этой статьи последней стабильной версией NPM была 7.6.3.
Проблема
После локального обновления до текущей версии NPM (7.*) и внесения некоторых изменений в package.json менеджер пакетов создал новую версию package-lock.json. Однако он создал файл блокировки «версии 2» (до сих пор он работал с файлами блокировки «версии 1»).
Когда один из моих товарищей по команде попытался установить пакеты, он получил это сообщение в консоли:
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I’ll try to do my best with it!
Старая версия NPM (6.*) не смогла правильно получить некоторые пакеты, и сборка завершилась неудачно. Решение было довольно простым — он обновил свою версию NPM, и мы двинулись дальше.
Но затем мы попытались развернуть проект с помощью DeployHQ и обнаружили, что их версия NPM по умолчанию действительно 6.* (что имеет смысл, большинство разработчиков все еще использует ее).
К счастью, поддержка DeployHQ всегда идеальна, поэтому мы смогли найти решение вместе. И вот оно -
Решение
В вашей команде конвейера сборки в DeployHQ (это должна быть одна команда, чтобы сохранить контекст) вам нужно загрузить нужную версию NPM, сделать ее версией по умолчанию, а затем использовать ее для установки других пакетов для вашего проекта (и делать все остальное).
Сначала я попробовал что-то вроде этого (и это не сработало) -
npm install [email protected] PATH=$(npm bin):$PATH npm install –-quiet npm run build
Это почти то, что вам нужно, но первая установка npm при наличии package-lock.json по-прежнему устанавливает все пакеты (а не только конкретную версию npm) — поэтому используется версия по умолчанию (6.*).
Поэтому мы обновим команду конвейера сборки следующим образом (теперь она работает) —
npm install [email protected] --no-package-lock PATH=$(npm bin):$PATH npm install –-quiet npm run build
Здесь сначала игнорируется package-lock.json (из-за параметра no-package-lock), устанавливается только [email protected] (и делается по умолчанию в следующей строке). Теперь его можно использовать для установки всего, что указано в package-lock.json (строка 3). Победа достигнута.
Честно говоря, вы, конечно, можете понизить версию NPM, которую использует ваша команда. Возможно, есть способ заставить NPM 7.* генерировать файл блокировки v1.
Но мы хотим быть в курсе последних событий и использовать как NPM 7.*, так и lockfile v2 (кажется, что он намного быстрее). И вы можете без проблем использовать его с DeployHQ.
И последнее, но не менее важное: еще одно большое спасибо поддержке DeployHQ. Вы, ребята, делаете большую работу.