Замаскируйте свою сломанную версию и лучше поймите, как работают 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
.