Чи є спосіб налаштувати кілька реєстрів в одному файлі npmrc


143

Ось моя проблема. У нас є приватний реєстр NPM, який працює лише у VPN. Я хотів би створити резервний реєстр https://registry.npmjs.org, щоб, коли я не в мережі VPN, він працює безперебійно.

PS В даний час я використовую npmrc, який добре справляється з перемиканням файлів .npmrc як вирішення.


8
Я насправді хотів би знати те саме. Можливо, в моєму приватному реєстрі спочатку пройти пінг, і якщо він не вдасться до резервного публічного реєстру (з локальної резервної копії, не одна установка на приватному сервері). Або ж переключення мого реєстру на основі мого імені wifi.
ProLoser

1
для втрачених душ, як я, корисний доктор npmrc
Андреас

Відповіді:


194

У вашому файлі можна мати кілька реєстрів для пакетів, що охоплюються.npmrc . Наприклад:

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

Пакети, що знаходяться в @polymerмежах сфери дії, будуть отримані з https://registry.npmjs.org , а решту отримаєте від вашого місцевого НПМ.


15
Дякую за цю пораду. Скажіть, будь ласка, чи можна додати автентифікацію до цих реєстрів? Тому що мені потрібен _auth ключ до мого основного реєстру.
Bloomca

3
Що таке пакет, що охоплюється? Я ніколи про це не чув.
jcollum

1
@jcollum, Scoped-пакети - це просто пакунки, які згруповані (або входять в рамки) через простір імен. Докладніше див. Docs.npmjs.com/misc/scope . Оцінка може бути використана для асоціації декількох пакетів (наприклад, @angular), що дозволяє легко зрозуміти, що пакет (@ angular / core) є частиною Angular, але також може бути компанією на кшталт @ mycompany / mypackage.
PatS

6
Це можливо без пакетів, що охоплюються? скажімо, якщо ми шукаємо цей конкретний пакет, перейдіть до цього реєстру, інакше перейдіть до цього реєстру
PinguinoSod

2
@PinguinoSod, Ні, це все-таки (станом на грудень 2019 року) неможливо для пакетів, що не входять в рамки. Сонатип - єдине рішення, про яке я знаю. Див stackoverflow.com/a/50995915/3281336
поплескує

71

У версії 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

1
Добре, але як є резервна
копія

1
Я отримую, Invalid package name "@npmjs/": name can only contain URL-friendly charactersколи бігаюnpm i
umutesen

У мене також ім'я може містити лише помилку, що
сприймає

Цей підхід для мене виглядає більш чистим. Чи є спосіб це зробити в package.json?
Харі Крішна Гаддіпаті

19

Для всіх, хто також шукає рішення для аутентифікації, я б додав до рішення, що охоплює пакет, що у вашому .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 до моєї ліб, але мій Lib має ще кілька залежностей, які потрібно встановити registry.npmjs.org, це працювало для мене
Чанука Асанка

17

Не найкращий спосіб, але якщо ви використовуєте 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/'

2
Аналогічне рішення - встановити псевдонім, який передає параметр --registry в npm. Це має той же ефект, але лише для однієї команди. Синтаксисalias npm-sin=npm --registry https://localhost:4873/
PatS

11

Оскільки минуло кілька років, і це не представляється можливим зробити (використовуючи лише npm), рішенням цієї проблеми є використання диспетчера репозиторії Nexus (від 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команду, щоб ваш пакет був опублікований у правильному репо-репо.


Чи можу я налаштувати обидва реєстру (для розгортання власних артефактів і для витягування загальнодоступних артефактів) у файлі .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 було надто складно.
Ігор

7

Ви можете використовувати синтаксис декількох сховищ для 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 для внутрішніх репостів.
Фернандо Фернандес

1
відповідно до цієї відповіді подвійний нахил не має значення, тому ви просто встановлюєте клавіші без значень
PinguinoSod

1
Наскільки я міг бачити з пристрою зчитування файлів властивостей npm / ini, // дійсно // буде читатися як ключ без значення. До речі, подібно до розділів, що охоплюються, він зберігатиметься як вторинні сервери реєстру. Вони потраплять в npm і будуть оброблятися як сервери конфігурації реєстру відповідно до алгоритму внутрішньої оцінки npm.
Фернандо Фернандес

1
Хтось спробував це рішення. Чи працює це і чи допомагає налаштувати резервне сховище?
Лука П. Іссак

3

Деякі кроки можна спробувати. (це, як ми робимо це на моєму робочому місці)

  • Створіть групу реєстру з двома (або більше) адресами джерела сховища. Один буде вашим внутрішнім приватним, а інший проксі до npmjs, надаючи пріоритет внутрішньому.
  • Зробіть цю групу свого реєстру у файлі .npmrc. Таким чином npm завжди намагатиметься отримати його з внутрішнього, якщо його не знайти, отримати його з проксі

Сподіваюся, що це допомагає.


6
Як можна створити групу реєстру в npm? Що це означає?
Tuupertunut

1
@Tuupertunut реєстр Найпростіший спосіб зробити це було б використовувати якийсь менеджер репозиторію, наприклад, sonatype nexus. Він може розміщувати приватні реєстри, проксі в npmjs, а також створювати групи сховищ.
Kaus Untwale



1

Станом на 13 квітня 2020 немає такої функціональності , якщо ви не в змозі використати різну сферу застосування, але ви можете використовувати постустановочний скрипт в якості обхідного шляху. Він завжди виконується, добре , після кожного встановлення npm :

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

Ваша поштова інсталяція може виглядати приблизно так:

"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 .


0

Мій підхід полягав у тому, щоб зробити невеликий варіант командного рядка, який додає перемикач реєстру.

Я створив ці файли в папці 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. я також

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.