Existe alguma maneira de configurar vários registros em um único arquivo npmrc


143

Aqui está o meu problema. Temos um registro NPM privado que funciona apenas em VPN. Gostaria de ter um registro de fallback https://registry.npmjs.org para que, quando eu estiver sem VPN, ele funcione perfeitamente.

PS Atualmente, estou usando o npmrc, que faz um bom trabalho ao alternar entre arquivos .npmrc como solução alternativa.


8
Na verdade, eu adoraria saber a mesma coisa. Talvez o meu registro particular seja pingado primeiro e, se houver falha no fallback no registro público (do fallback local, não uma configuração no servidor privado). Ou alternativamente, alternando meu registro com base no meu nome de wifi.
ProLoser

1
para almas perdidas como eu, um documento útil para npmrc
Andreas

Respostas:


194

Você pode ter vários registros para pacotes com escopo definido no seu .npmrcarquivo. Por exemplo:

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

Os pacotes no @polymerescopo serão recebidos em https://registry.npmjs.org , mas o restante será recebido do seu NPM local.


15
Obrigado por este conselho. Você poderia dizer, é possível adicionar autenticação a esses registros com escopo? Porque eu preciso da chave _auth no meu registro principal.
Bloomca

3
O que é um pacote com escopo? Eu nunca ouvi falar disso.
Jcollum # 16/16

1
@jcollum, pacotes com escopo são simplesmente pacotes agrupados (ou com escopo) por meio de um espaço para nome. Consulte docs.npmjs.com/misc/scope para obter detalhes. O escopo pode ser usado para associar vários pacotes (como @angular), o que facilita saber que um pacote (@ angular / core) faz parte do Angular, mas também pode ser uma empresa como @ mycompany / mypackage.
Pats

6
Isso é possível sem pacotes com escopo definido? Vamos dizer que se nós estamos olhando para este pacote específico ir para este registro, caso contrário, ir para esse registro
PinguinoSod

2
@PinguinoSod, Não, ainda é (em dezembro de 2019) impossível para pacotes sem escopo. Sonatype é a única solução que eu conheço. Veja stackoverflow.com/a/50995915/3281336
PatS

71

Na versão 4.4.1, se você pode alterar o nome do pacote, use:

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

Onde @mycoestá o escopo do seu pacote.

Você pode instalar o pacote desta maneira:

npm install @myco/my-package

Para mais informações: https://docs.npmjs.com/misc/scope


Também é necessário iniciar seu pacote com o escopo (npm init --scope = myco) e depois publicá-lo.
gjegadesh

1
Ok, mas como ter um fallback para esse registro
CharybdeBE

1
Estou recebendo Invalid package name "@npmjs/": name can only contain URL-friendly charactersquando corronpm i
umutesen 03/07/19

Eu também tenho o nome só pode conter erro caracteres URL-friendly
katwhocodes

Essa abordagem parece mais limpa para mim. Existe uma maneira de fazer isso no package.json?
Hari Krishna Gaddipati

19

Para quem procura também uma solução para autenticação, eu adicionaria à solução de pacotes com escopo definido que você pode ter várias linhas em seu .npmrcarquivo:

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

Cada linha representa um registro NPM diferente


4
Gostaria de usar o comando npm login --registry=npm.example.com. Ele armazenará as credenciais de login (authTokens) no arquivo .npmrc na sua pasta de usuário, para que você não precise tê-lo no código-fonte ( docs.npmjs.com/cli/adduser )
magikMaker

ele trabalhou para mim, obrigado, Basicamente eu tinha registro nexo particular ao meu lib mas meu Lib tem mais algumas dependências que precisam instalar a partir registry.npmjs.org, isso funcionou para mim
Chanuka Asanka

17

Não é a melhor maneira, mas se você estiver usando mac ou linux, mesmo no Windows, poderá definir alias para diferentes registros.

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'

2
Uma solução semelhante é configurar um alias que passe a opção --registry para o npm. Isso tem o mesmo efeito, mas apenas para o único comando. A sintaxe éalias npm-sin=npm --registry https://localhost:4873/
PatS

11

Como já faz alguns anos e não parece possível fazer isso (usando apenas o npm), uma solução para esse problema é usar o Nexus Repository Manager (da Sonatype). O Nexus suporta vários repositórios, permite solicitá-los e também proxies / caches para melhorar a velocidade.

Existe uma versão gratuita e uma versão pro / paga. O recurso que suporta isso está descrito em: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

As informações relevantes são duplicadas abaixo; portanto, se / quando o URL / link acima parar de funcionar, as informações ainda estarão aqui.

Um grupo de repositórios é a maneira recomendada de expor todos os seus repositórios de registros npm do gerenciador de repositórios para seus usuários, sem precisar de nenhuma configuração adicional do lado do cliente. Um grupo de repositórios permite expor o conteúdo agregado de vários repositórios proxy e hospedados com um URL para o npm e outras ferramentas.

Permite criar registros privados da NPM

Um registro npm privado pode ser usado para carregar seus próprios pacotes, bem como pacotes de terceiros.

E

Para reduzir downloads duplicados e melhorar a velocidade de download para seus desenvolvedores e servidores de CI, você deve fazer proxy do registro hospedado em https://registry.npmjs.org . Por padrão, o npm acessa esse registro diretamente. Você também pode fazer proxy de outros registros necessários.

Portanto, uma rápida lista com marcadores do que você faz para que isso funcione é:

  • Instale o Nexus

  • Crie um repositório local / privado (ou aponte para seu repositório particular em outro servidor)

  • Crie um GRUPO que liste seu repositório particular e o repositório público.

  • Configure o seu arquivo $ HOME / .npmrc para apontar para o "GRUPO" recém-criado.

  • Publique seus pacotes npm privados no repositório local.

  • Os usuários agora podem executar uma configuração única.

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

  • Em seguida, os usuários podem instalar pacotes públicos ou privados via npm install. npm install my-private-package npm install lodash any-other-public-package

E seus pacotes públicos e privados podem ser instalados através de um npm installcomando simples . O Nexus encontra o pacote pesquisando cada repositório configurado no grupo e retorna os resultados. Portanto, o npm ainda acha que existe apenas um registro, mas atrás da cortina existem vários repositórios sendo usados.

NOTA IMPORTANTE: Ao publicar seus componentes, você precisará especificar o npm publish --registry https://nexus/content/repositories/private-repo my-private-packagecomando para que seu pacote seja publicado no repositório correto.


posso configurar o registro (para implantar meus próprios artefatos e puxar artefatos públicos) no arquivo .npmrc para que eu não precise ser mencionado sempre que estiver publicando o npm? Para empurrar meus artefatos, estou usando o repositório npm separado e para puxar todos os artefatos, estou usando o repositório virtual. Por favor, ajude-me a configurar ambos no arquivo .npmrc.
Anshita Singh 30/03

1
@AnshitaSingh Acabei de passar por isso. Se você gosta de mim, tem um repositório diferente para publicação (por exemplo, em npm-privatevez de npm-group), você pode substituir a registrytecla-no package.jsondo seu projeto (veja https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagespara detalhes). Usando npm config set registry <url>você pode configurá-lo como npm-group, por exemplo , o que contém npm-registry(repositório de encaminhamento) e npm-private(seu próprio repositório). Eu usei essa solução, porque obter artefatos do GitLab CE local era muito complicado.
Igor

7

Você pode usar a sintaxe de vários repositórios para a registryentrada no seu .npmrcarquivo:

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

Isso faria o seu npm procurar pacotes em diferentes servidores.


Sim, mas as serverA, serverBe serverCexemplo repositórios são todos da nossa rede interna, não vai funcionar para você. Não sei se é adequado para você, mas, se achar que pode, tente implantar um Nexus Repository Manager para os repositórios internos.
Fernando Fernandes

1
de acordo com esta resposta a barra dupla não tem nenhum significado, então você está apenas definindo as chaves sem valores
PinguinoSod

1
Tanto quanto pude ver no leitor de arquivos de propriedades npm / ini, de fato, o // será lido como chave sem valor. A propósito, como as seções de escopo, ele será armazenado como servidores de registro secundários. Eles entrarão no npm e serão processados ​​como servidores de configuração do registro de acordo com o algoritmo de avaliação interna do npm.
Fernando Fernandes

1
Alguém já tentou esta solução. Funciona e ajuda a configurar um repositório de fallback?
Luke P. Issac

3

Alguns passos que você pode tentar. (é como fazemos no meu local de trabalho)

  • Crie um grupo de registros com dois (ou mais) endereços de origem do repositório. Um seria o seu privado interno e o outro um proxy para o npmjs, dando prioridade ao interno.
  • Faça deste grupo seu registro no arquivo .npmrc. Dessa forma, o npm sempre tentará obtê-lo do interno, se não for encontrado, obtê-lo do proxy

Espero que ajude.


6
Como alguém cria um grupo de registro no npm? O que isso significa?
Tuupertunut 28/09

1
Registro do @Tuupertunut A maneira mais fácil de fazer isso seria usar algum tipo de gerenciador de repositório, como o sonatype nexus. Ele pode hospedar registros particulares, proxy no npmjs, além de criar grupos de repositórios.
Kaus Untwale 29/09/16



1

A partir de 13 de abril de 2020, não existe essa funcionalidade, a menos que você possa usar escopos diferentes, mas você pode usar o script pós-instalação como solução alternativa. É sempre executado, bem , após cada instalação do npm :

Digamos que você tenha o .npmrc configurado para instalar o @ foo-org / foo-pack-private a partir do seu repositório particular do github, mas o pacote público @ foo-org / foo-pack-public está no npm (sob o mesmo escopo: foo- org ).

Sua pós-instalação pode ficar assim:

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

Não se esqueça de remover @ foo-pack / foo-org da matriz de dependências para garantir que a instalação do npm não tente obtê-la no github e para adicionar o sinalizador --dry-run que garante package.json e package- O lock.json permanece inalterado após a instalação do npm .


0

Minha abordagem foi criar uma ligeira variante de linha de comando que adiciona a opção de registro.

Criei esses arquivos na pasta nodejs, onde o executável npm é encontrado:

npm-.cmd:

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

npm-:

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

Agora, se eu quiser fazer uma operação no registro npm normal (enquanto não estiver conectado à VPN), digite apenas npm-onde normalmente digitaria npm.

Para testar este comando e ver o registro de um pacote, use este exemplo:

npm- view lodash

PS. Estou no windows e testei isso no Bash, CMD e Powershell. eu também

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.