Иногда необходимо переместить пакеты узлов из одного реестра в другой. Например, вы можете переключиться на частный реестр из соображений безопасности или, в моем случае, перенести свои пакеты из одного проекта 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. Если из их названий неясно, эти переменные представляют старый и новый реестры соответственно. Убедитесь, что вы заменили их фактическими адресами реестров, из которых и в которые вы выполняете миграцию.

Далее мы определяем массив пакетов, которые будут перенесены. Этот массив можно изменить, чтобы включить любое количество пакетов, которые вы хотите скопировать.

Затем мы перебираем каждый пакет в массиве и для каждого пакета перебираем каждую доступную версию пакета. Для каждой версии скрипт выполняет следующие шаги:

  1. Устанавливает пакет указанной версии с помощью команды npm install.
  2. Устанавливает реестр в новый реестр с помощью команды npm config set.
  3. Публикует пакет в новом реестре с помощью команды npm publish.
  4. Возвращает реестр к старому с помощью команды 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:

  1. Перейдите на официальный сайт и скачайте соответствующий бинарник для вашей операционной системы.
  2. Извлеките содержимое загруженного архива в папку по вашему выбору (например, /usr/local/bin).
  3. Добавьте папку, содержащую исполняемый файл jq, в переменную среды PATH, добавив следующую строку в файл запуска оболочки (например, ~/.bashrc или ~/.zshrc):
export PATH="/usr/local/bin:$PATH"

После того, как вы установили jq любым из этих способов, вы можете повторно запустить предыдущую команду, и она должна работать как положено.