Мы используем 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. Вы, ребята, делаете большую работу.