npmrc несколько реестров для одной и той же области

Можно ли содержать несколько реестров для одной и той же области? В моей компании мы используем @mycompany область как для публичного реестра npm, так и для внутренних реестров.

Я пытался сделать

@mycompany:registry=https://company.registry.com
@mycompany:registry=https://registry.npmjs.org

но это не сработало.

1 ответ

Решение

Нет, ты не можешь. к несчастью npm может обрабатывать только один реестр одноранговых областей. Но вы можете использовать прокси-сервер в качестве Verdaccio для этого, который управляет распределением для вас. https://verdaccio.org/docs/en/uplinks

Я приведу пример конфигурации с использованием Verdaccio:

Я издевался над "реестром компаний" без внешнего доступа ( http://localhost:5000/).

storage: /Users/test/.local/share/verdaccio/storage_company_registry

auth:
  htpasswd:
    file: ./htpasswd   
packages:
  '@*/*':
    access: $all
    publish: $authenticated

  '**':
    access: $all
    publish: $all
middlewares:
  audit:
    enabled: true
logs:
  - {type: stdout, format: pretty, level: http}

Как видите, пульты (uplink) не настроены, они полностью автономны.

Затем я запущу свое предложение Verdaccio ( http://localhost:4873/), которое сначала запрашивает реестр компании, и если пакет там не найден, он будет извлечен из открытого реестра (npmjs).

storage: /Users/test/.local/share/verdaccio/storage_proxy

auth:
  htpasswd:
    file: ./htpasswd
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
  company:
    url: https://company.registry.com

packages:
  '@company/*':
    access: $all
    publish: $authenticated
    proxy: company npmjs  
  '**':
    access: $all
    publish: $authenticated
    proxy: npmjs
middlewares:
  audit:
    enabled: true
logs:
  - {type: stdout, format: pretty, level: http}

Как PoC (я переключаю @company на @babel) я бегу npm install @babel/types --registry http://localhost:4873/, Результат следующий

 warn --- config file  - /Users/test/.config/verdaccio/config.yaml
 warn --- Plugin successfully loaded: htpasswd
 warn --- Plugin successfully loaded: audit
 warn --- http address - http://localhost:4873/ - verdaccio/4.0.0-alpha.4
 http --> 404, req: 'GET http://localhost:5000/@babel%2Ftypes' (streaming)
 http --> 404, req: 'GET http://localhost:5000/@babel%2Ftypes', bytes: 0/43
 http --> 200, req: 'GET https://registry.npmjs.org/@babel%2Ftypes' (streaming)
 http --> 200, req: 'GET https://registry.npmjs.org/@babel%2Ftypes', bytes: 0/93375
 http <-- 200, user: null(127.0.0.1), req: 'GET /@babel%2ftypes', bytes: 0/22072
 http --> 200, req: 'GET https://registry.npmjs.org/esutils' (streaming)
 http --> 200, req: 'GET https://registry.npmjs.org/esutils', bytes: 0/23169
 http <-- 200, user: null(127.0.0.1), req: 'GET /esutils', bytes: 0/3854
 http --> 200, req: 'GET https://registry.npmjs.org/to-fast-properties' (streaming)
 http --> 200, req: 'GET https://registry.npmjs.org/to-fast-properties', bytes: 0/8239
 http <-- 200, user: null(127.0.0.1), req: 'GET /to-fast-properties', bytes: 0/1725
 http --> 200, req: 'GET https://registry.npmjs.org/lodash' (streaming)
 http --> 200, req: 'GET https://registry.npmjs.org/lodash', bytes: 0/185410
 http <-- 200, user: null(127.0.0.1), req: 'GET /lodash', bytes: 0/14307
 http <-- 200, user: null(127.0.0.1), req: 'POST /-/npm/v1/security/audits/quick', bytes: 474/146

Ваш менеджер пакетов узла будет говорить с ( http://localhost:4873/), а Verdaccio попытается извлечь пакет из внутреннего реестра, результат будет 404, во второй итерации будет извлекать пакет из npmjs, в результате чего получится 200.

Наличие прокси-реестра делает процесс более прозрачным для вашей команды, все централизованно и более эффективно, ihmo.

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

Другие вопросы по тегам