Иногда необходимо переместить пакеты узлов из одного реестра в другой. Например, вы можете переключиться на частный реестр из соображений безопасности или, в моем случае, перенести свои пакеты из одного проекта GCP в другой, потому что репозиторий test-npm-repo в вашем проекте разработки произошел чтобы завоевать популярность и теперь размещает все ваши производственные пакеты.
Что ж, если вы чем-то похожи на меня и бьетесь головой о стену, пытаясь сделать что-то подобное, надеюсь, этот удобный скрипт вам поможет.
Прежде чем ты начнешь
Следующий сценарий предназначен для переноса списка пакетов из старого реестра в новый реестр. Предполагается, что у вас есть доступ к обоим реестрам и необходимые разрешения для публикации пакетов. Если вы используете Google Cloud Platform, как я для этого проекта, вы можете легко войти в систему, используя npx google-artifactregistry-auth
.
Вы также захотите запустить его из проекта узла, так как он будет активно использовать команды npm. Если у вас его нет в наличии, вы можете создать его, запустив npm init -y
во вновь созданном каталоге.
Наконец, предполагается, что у вас установлен jq. Если вы этого не сделаете, ознакомьтесь с разделом ниже для получения дополнительной информации о том, почему он используется и как его установить.
Сценарий
oldregistry="https://my-old-registry.com" newregistry="https://my-new-registry.com" packages=( "@myDomain/package1" "@myDomain/package2" "@myDomain/package3" ) for package in "${packages[@]}"; do for version in $(npm view "$package" --json | jq -r '.versions[]'); do npm install "$package@${version}" --ignore-scripts npm config set "@myDomain:registry" "$newregistry" npm publish ./node_modules/"$package" npm config set "@myDomain:registry" "$oldregistry" done done
Сценарий начинается с определения двух переменных: oldregistry
и newregistry
. Если из их названий неясно, эти переменные представляют старый и новый реестры соответственно. Убедитесь, что вы заменили их фактическими адресами реестров, из которых и в которые вы выполняете миграцию.
Далее мы определяем массив пакетов, которые будут перенесены. Этот массив можно изменить, чтобы включить любое количество пакетов, которые вы хотите скопировать.
Затем мы перебираем каждый пакет в массиве и для каждого пакета перебираем каждую доступную версию пакета. Для каждой версии скрипт выполняет следующие шаги:
- Устанавливает пакет указанной версии с помощью команды
npm install
. - Устанавливает реестр в новый реестр с помощью команды
npm config set
. - Публикует пакет в новом реестре с помощью команды
npm publish
. - Возвращает реестр к старому с помощью команды
npm config set
.
Этот процесс повторяется для каждой доступной версии каждого пакета в массиве.
Это может занять некоторое время, особенно если у вас много пакетов, но через некоторое время скрипт должен завершиться, и все ваши пакеты будут доступны в вашем новом реестре. Убедитесь, что вы обновили все проекты, которые публикуются или устанавливаются из старого реестра!
jq
В приведенном выше сценарии jq используется для анализа вывода JSON команды npm view
и извлечения доступных версий пакета.
В частности, команда npm view "$package" --json | jq -r '.versions[]'
используется для получения версий пакета с именем $package
. Команда npm view
используется для получения информации о конкретном пакете из реестра npm, но возвращает массив строк, которые нелегко использовать в остальной части скрипта. При передаче параметра --json
команда выводит информацию в формате JSON, которая затем передается команде jq
.
Команда jq
с фильтром .versions[]
выбирает только поле «версии» из вывода JSON и возвращает массив всех доступных версий пакета. Опция -r
используется для вывода результата в необработанном формате (без кавычек).
Полученный массив версий затем используется в цикле для установки каждой версии пакета и публикации ее в новом реестре.
Установка jq
Если вы используете macOS, вы можете установить jq
с помощью Homebrew:
brew install jq
Кроме того, вы можете скачать бинарный файл с официального сайта и добавить его в свой PATH:
- Перейдите на официальный сайт и скачайте соответствующий бинарник для вашей операционной системы.
- Извлеките содержимое загруженного архива в папку по вашему выбору (например,
/usr/local/bin
). - Добавьте папку, содержащую исполняемый файл
jq
, в переменную среды PATH, добавив следующую строку в файл запуска оболочки (например,~/.bashrc
или~/.zshrc
):
export PATH="/usr/local/bin:$PATH"
После того, как вы установили jq
любым из этих способов, вы можете повторно запустить предыдущую команду, и она должна работать как положено.