Замаскируйте свою сломанную версию и лучше поймите, как работают dist-теги npm.

TL;DR

npm dist-tag add <package-name>@<last-working-version> latest

Контекст

Здесь, в Outbrain, мы работаем с CI/CD над публикацией наших пакетов npm, и несколько дней назад я обновил небольшой пакет, который используется в процессе развертывания, проверил код и выпустил пакет через наш конвейер. CI провел тесты и опубликовал новую версию. 🎉

Но прошел час, и разработчики начали жаловаться на то, что пайплайны начинают глючить, и я быстро выяснил, что причиной тому было мое обновление! Так быстро я нашел проблему и устранил ее. Но когда я запустил конвейер, я получил ту же ошибку, что и все, и я не смог выпустить свое исправление! 😱

Еще немного покопавшись, я обнаружил, что процесс CI/CD всегда использует последнюю версию пакета, который я обновил, и поскольку я сломал последнюю версию пакета, я не мог выпустить свое исправление для обновления пакета. Итак, что я мог сделать? 🤔

"Последний"

Когда мы хотим установить новый пакет в наш репозиторий, мы можем указать конкретную версию или позволить npm принять решение. По умолчанию npm устанавливает «последнюю» версию, но «последняя» не всегда означает самую новую версию.

# install version 1.0.0
npm install [email protected]
# install the “latest” version
npm install npm-rollback

Когда мы запускаем npm install без указания тега, NPM автоматически разрешает последний тег.

# both are equal
npm install npm-rollback
npm install npm-rollback@latest

Пользовательские теги

Когда мы публикуем новую версию нашего пакета, npm автоматически присваивает этой новой версии тег «последняя», но мы можем указать конкретный тег вместо «последний».

npm publish --tag best

Эта команда опубликует нашу самую новую версию под тегом «лучшая», но что произойдет с тегом «последняя»? Ну, мы можем проверить с помощью команды dist-tag. Команда dist-tag позволяет нам перечислять, устанавливать и удалять теги.

Если мы запустим эту команду, мы увидим все теги нашего пакета.

npm dist-tag ls npm-rollback
# output:
# best: 1.0.1
# latest: 1.0.0

Как видите, недавно опубликованная версия теперь находится под тегом «лучшая», но тег «последняя» по-прежнему указывает на старую версию!

Если мы хотим удалить тег «лучший», выполните следующую команду:

npm dist-tag rm npm-rollback best

Чтобы добавить новый тег, мы можем запустить следующее:

npm dist-tag add [email protected] oreo

Решение

Таким образом, чтобы замаскировать нашу ошибочную версию, мы можем заменить последний тег рабочей версией. В случае с нашим пакетом все, что нам нужно запустить, это

npm dist-tag add [email protected] latest

И это все! В следующий раз, когда кто-то запустит npm install npm-rollback, NPM установит версию 1.0.0 вместо самой новой версии 1.0.1.