Есть ли способ настроить несколько реестров в одном файле npmrc

162

Вот моя проблема. У нас есть частный реестр NPM, который работает только в VPN. Я хотел бы иметь резервный реестр https://registry.npmjs.org, чтобы он работал без проблем, когда у меня нет VPN.

PS В настоящее время я использую npmrc, который хорошо справляется с переключением между файлами .npmrc в качестве временного решения.

Абхиджит Мазумдер
источник
8
Я действительно хотел бы узнать то же самое. Может быть, либо мой частный реестр будет сначала проверен, а если он не удастся вернуться к общедоступному реестру (из локального резервного копирования, а не одной настройки на частном сервере). Или, в качестве альтернативы, переключение моего реестра на основе моего имени Wi-Fi.
ProLoser
1
для заблудших душ вроде меня полезный документ для npmrc
Андреас

Ответы:

211

В вашем файле может быть несколько реестров для пакетов с ограниченной областью действия.npmrc . Например:

@polymer:registry=<url register A>
registry=http://localhost:4873/

Пакеты, входящие в @polymerобласть действия, будут получены с https://registry.npmjs.org , а остальные будут получены от вашего местного NPM.

Хосе Альберто Руис
источник
16
Спасибо за этот совет. Не могли бы вы рассказать, можно ли добавить аутентификацию в эти реестры с ограниченным объемом? Потому что мне нужен ключ _auth для моего основного реестра.
Bloomca
3
Что такое пакет с ограниченным объемом? Я никогда об этом не слышал.
jcollum
1
@jcollum, пакеты с областью действия - это просто пакеты, которые сгруппированы (или ограничены областью действия) через пространство имен. Подробнее см. Docs.npmjs.com/misc/scope . Область видимости может использоваться для связывания нескольких пакетов (например, @angular), что позволяет легко узнать, что пакет (@ angular / core) является частью Angular, но также может быть такой компанией, как @ mycompany / mypackage.
PatS
7
Возможно ли это без пакетов с ограниченным объемом? скажем, если мы ищем этот конкретный пакет, перейдите в этот реестр, в противном случае перейдите в этот реестр
PinguinoSod
2
@PinguinoSod, Нет, это все еще (по состоянию на декабрь 2019 г.) невозможно для пакетов без области видимости. Sonatype - единственное известное мне решение. См stackoverflow.com/a/50995915/3281336
похлопывает
77

В версии 4.4.1, если вы можете изменить имя пакета, используйте:

npm config set @myco:registry http://reg.example.com

Где @mycoваша посылка?

Установить пакет можно следующим образом:

npm install @myco/my-package

Для получения дополнительной информации: https://docs.npmjs.com/misc/scope

Жилберто Александр
источник
Также требуется инициализировать ваш пакет с областью действия (npm init --scope = myco), а затем опубликовать его.
gjegadesh
3
Хорошо, но как иметь запасной вариант для этого реестра
CharybdeBE
1
Я получаю, Invalid package name "@npmjs/": name can only contain URL-friendly charactersкогда бегуnpm i
umutesen
У меня также есть имя, которое может содержать только URL-дружественные символы, ошибка
katwhocodes
1
Мне этот подход кажется более чистым. Есть ли способ сделать это в package.json?
Хари Кришна Гаддипати
21

Для тех, кто также ищет решение для аутентификации, я бы добавил решение с ограниченными пакетами, в котором вы можете иметь несколько строк в вашем .npmrcфайле:

//internal-npm.example.com:8080/:_authToken=xxxxxxxxxxxxxxx
//registry.npmjs.org/:_authToken=yyyyyyyyyy

Каждая строка представляет отдельный реестр NPM

Грегра
источник
4
Я бы использовал команду npm login --registry=npm.example.com. Он будет хранить учетные данные для входа (authTokens) в файле .npmrc в вашей папке пользователя, поэтому вам не нужно иметь их в исходном коде ( docs.npmjs.com/cli/adduser )
magikMaker
это сработало для меня, спасибо, в основном у меня был частный реестр nexus для моей библиотеки, но у моей библиотеки есть еще несколько зависимостей, которые необходимо установить registry.npmjs.org, это сработало для меня
Chanuka Asanka
20

Не лучший способ, но если вы используете Mac или Linux даже в Windows, вы можете установить псевдонимы для разных реестров.

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'
Bawa G
источник
5
Аналогичное решение - настроить псевдоним, который передает параметр --registry в npm. Это имеет тот же эффект, но только для одной команды. Синтаксисalias npm-sin=npm --registry https://localhost:4873/
PatS
11

Поскольку прошло уже несколько лет, и это не представляется возможным (используя только npm), решение этой проблемы - использовать Nexus Repository Manager. (от Sonatype). Nexus поддерживает несколько репозиториев, позволяет вам их заказывать, а также прокси / кеши для повышения скорости.

Существуют бесплатная версия, а также про / платная версия. Функция, поддерживающая это, описана по адресу: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries.

Соответствующая информация дублируется ниже, поэтому, если / когда вышеуказанный URL / ссылка перестанет работать, информация все еще будет здесь.

Группа репозиториев - это рекомендуемый способ предоставить пользователям доступ ко всем вашим репозиториям реестров npm из менеджера репозиториев без необходимости дальнейшей настройки на стороне клиента. Группа репозиториев позволяет вам предоставлять агрегированный контент нескольких прокси и размещенных репозиториев с одним URL-адресом для npm и других инструментов.

Он позволяет создавать частные реестры npm

Частный реестр npm может использоваться для загрузки ваших собственных пакетов, а также сторонних пакетов.

А также

Чтобы уменьшить количество дублирующих загрузок и повысить скорость загрузки для ваших разработчиков и серверов CI, вам следует проксировать реестр, размещенный на https://registry.npmjs.org . По умолчанию npm обращается к этому реестру напрямую. Вы также можете использовать прокси для любых других реестров, которые вам нужны.

Итак, краткий список вещей, которые вы должны сделать, чтобы это работало:

  • Установить Nexus

  • Создайте локальное / частное репо (или укажите на свое частное репо на другом сервере)

  • Создайте ГРУППУ, в которой перечислены ваше частное репо и публичное репо.

  • Настройте файл $ HOME / .npmrc так, чтобы он указывал на только что созданную «ГРУППУ».

  • Опубликуйте свои частные пакеты npm в локальном репо.

  • Теперь пользователи могут запускать однократную настройку.

npm config set registry https://nexus/content/groups/GROUP

  • Затем пользователи могут устанавливать как общедоступные, так и частные пакеты через npm install. npm install my-private-package npm install lodash any-other-public-package

И ваши общедоступные и частные пакеты могут быть установлены с помощью простого npm install команды. Nexus находит пакет, просматривая каждое репо, настроенное в группе, и возвращает результаты. Таким образом, npm по-прежнему считает, что существует только один реестр, но за кулисами используется несколько репозиториев.

ВАЖНОЕ ПРИМЕЧАНИЕ. Когда вы публикуете свои компоненты, вам необходимо указать npm publish --registry https://nexus/content/repositories/private-repo my-private-packageкоманду, чтобы ваш пакет был опубликован в правильном репозитории.

PatS
источник
Могу ли я настроить оба реестра (для развертывания моих собственных артефактов и для извлечения общедоступных артефактов) в файле .npmrc, чтобы мне не приходилось упоминать каждый раз, когда я публикую npm? Для продвижения своих артефактов я использую отдельный репозиторий npm, а для извлечения всех артефактов я использую виртуальный репозиторий. Пожалуйста, помогите мне настроить оба в файле .npmrc.
Аншита Сингх
1
@AnshitaSingh Я только что прошел через это. Если вам нравится, что у меня есть другой репозиторий для публикации (например, npm-privateвместо npm-group), вы можете переопределить registry-key в package.jsonвашем проекте (см. https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesПодробности). Используя, npm config set registry <url>вы можете установить его, например npm-group, который содержит npm-registry(репозиторий пересылки) и npm-private(ваш собственный репозиторий). Я использовал это решение, потому что получить артефакты из локального GitLab CE было слишком сложно.
Игорь
8

Вы можете использовать синтаксис нескольких репозиториев для registryзаписи в вашем .npmrcфайле:

registry=http://serverA.url/repository-uri/
//serverB.url/repository-uri/
//serverC.url/repository-uri/:_authToken=00000000-0000-0000-0000-0000000000000
//registry.npmjs.org/

Это заставит ваш npm искать пакеты на разных серверах.

Фернандо Фернандес
источник
Да, но serverA, serverBи serverCпример хранилища все из нашей внутренней сети, не будет работать для вас. Я не знаю, подходит ли он вам, но если вы думаете, что это так, вы можете попробовать развернуть Nexus Repository Manager для внутренних репозиториев.
Фернандо Фернандес,
1
согласно этому ответу двойная косая черта не имеет смысла, поэтому вы просто устанавливаете ключи без значений
PinguinoSod
1
Насколько я мог видеть из программы чтения файлов свойств npm / ini, действительно, // будет считываться как ключ без значения. Кстати, как и разделы с заданной областью, он будет храниться как вторичный сервер реестра. Они попадут в npm и будут обрабатываться как серверы конфигурации реестра в соответствии с внутренним алгоритмом оценки npm.
Фернандо Фернандес
1
Кто-нибудь пробовал это решение. Работает ли он и помогает ли настроить резервный репозиторий?
Люк П. Иссак,
1
Есть ли официальная документация, описывающая эту функцию? Я не могу найти ни одного.
Юлиан
4

Некоторые шаги вы можете попробовать. (это то, как мы это делаем на моем рабочем месте)

  • Создайте группу реестра с двумя (или более) адресами источника репозитория. Один будет вашим внутренним приватным, а другой прокси для npmjs, отдавая приоритет внутреннему.
  • Сделайте эту группу своим реестром в файле .npmrc. Таким образом, npm всегда будет пытаться получить его с внутреннего, если не найден, получить его с прокси

Надеюсь, это поможет.

Каус Унтвале
источник
6
Как создать группу реестра в npm? Что это значит?
Tuupertunut
1
Реестр @Tuupertunut Самый простой способ сделать это - использовать какой-нибудь менеджер репозитория, например sonatype nexus. Он может размещать частные реестры, прокси в npmjs, а также создавать группы репозиториев.
Kaus Untwale
1

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

ксимопен
источник
1

По состоянию на 13 апреля 2020 года такая функциональность отсутствует, если вы не можете использовать другие области действия, но вы можете использовать сценарий postinstall в качестве временного решения. Она всегда выполняется, а после каждой НОЙ установки :

Скажем, у вас есть ваш .npmrc, настроенный для установки @ foo-org / foo-pack-private из вашего частного репозитория github, но общедоступный пакет @ foo-org / foo-pack-public находится в npm (в той же области: foo- org ).

Ваша постустановка может выглядеть так:

"scripts": {
    ...
    "postinstall": "mv .npmrc .npmrcc && npm i @foo-org/foo-pack --dry-run && mv .npmrcc .npmrc".
}

Не забудьте удалить @ foo-pack / foo-org из массива зависимостей, чтобы убедиться, что npm install не пытается получить его из github, и добавить флаг --dry-run, который гарантирует, что package.json и package- lock.json остается без изменений после установки npm .

Василеску Андрей
источник
1

Мой подход заключался в создании небольшого варианта командной строки, который добавляет переключатель реестра.

Я создал эти файлы в папке nodejs, где находится исполняемый файл npm:

npm-.cmd:

@ECHO OFF
npm --registry https://registry.npmjs.org %*

npm-:

#!/bin/sh
"npm" --registry https://registry.npmjs.org "$@"

Теперь, если я хочу выполнить операцию с обычным реестром npm (пока я не подключен к VPN), я просто набираю npm-там, где обычно npm.

Чтобы проверить эту команду и просмотреть реестр пакета, используйте этот пример:

npm- view lodash

PS. Я работаю в Windows и тестировал это в Bash, CMD и Powershell. Я также

Марк Уитфельд
источник