¿Hay alguna manera de configurar múltiples registros en un solo archivo npmrc?

143

Aquí está mi problema. Tenemos un registro privado de NPM que solo funciona en VPN. Me gustaría tener un registro de respaldo https://registry.npmjs.org para que cuando esté fuera de VPN funcione sin problemas.

PD Actualmente estoy usando npmrc que hace un buen trabajo al cambiar entre archivos .npmrc como solución alternativa

Abhijit Mazumder
fuente
8
De hecho, me encantaría saber lo mismo. Tal vez haga que mi registro privado se bloquee primero y si falla el respaldo al registro público (desde el respaldo local, no una configuración en el servidor privado). O, alternativamente, cambiar mi registro en función de mi nombre wifi.
ProLoser
1
para almas perdidas como yo, un documento útil para npmrc
Andreas

Respuestas:

194

Puede tener múltiples registros para paquetes con alcance en su .npmrcarchivo. Por ejemplo:

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

Los paquetes bajo @polymeralcance se recibirán de https://registry.npmjs.org , pero el resto se recibirá de su NPM local.

José Alberto Ruiz
fuente
15
Gracias por este consejo ¿Podría decirnos si es posible agregar autenticación a estos registros de ámbito? Porque necesito la clave _auth para mi registro principal.
Bloomca
3
¿Qué es un paquete con alcance? Nunca he oído hablar de esto.
jcollum
1
@jcollum, los paquetes con ámbito son simplemente paquetes agrupados (o con ámbito) a través de un espacio de nombres. Consulte docs.npmjs.com/misc/scope para más detalles. El alcance se puede utilizar para asociar varios paquetes (como @angular), lo que facilita saber que un paquete (@ angular / core) es parte de Angular, pero también podría ser una empresa como @ mycompany / mypackage.
PatS
66
¿Es esto posible sin paquetes con alcance? Digamos que si estamos buscando este paquete específico, ve a este registro, de lo contrario, ve a ese registro
PinguinoSod
2
@PinguinoSod, No, todavía es (a partir de diciembre de 2019) no es posible para los paquetes sin ámbito. Sonatype es la única solución que conozco. Ver stackoverflow.com/a/50995915/3281336
PatS el
71

En la versión 4.4.1, si puede cambiar el nombre del paquete, use:

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

¿Dónde @mycoestá el alcance de su paquete?

Puede instalar el paquete de esta manera:

npm install @myco/my-package

Para más información: https://docs.npmjs.com/misc/scope

Gilberto Alexandre
fuente
También es necesario iniciar su paquete con el alcance (npm init --scope = myco) y luego publicarlo.
gjegadesh
1
Bien, pero cómo tener una reserva para ese registro
CharybdeBE
1
Me Invalid package name "@npmjs/": name can only contain URL-friendly charactersnpm i
sale
También tengo el nombre sólo puede contener caracteres de error URL amigable
katwhocodes
Este enfoque me parece más limpio. ¿Hay alguna manera de hacer esto en package.json?
Hari Krishna Gaddipati
19

Para cualquiera que busque también una solución para la autenticación, agregaría en la solución de paquetes con alcance que puede tener varias líneas en su .npmrcarchivo:

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

Cada línea representa un registro NPM diferente

Gregra
fuente
44
Yo usaría el comando npm login --registry=npm.example.com. Almacenará las credenciales de inicio de sesión (authTokens) en el archivo .npmrc en su carpeta de usuario, por lo que no necesita tenerlo en el código fuente ( docs.npmjs.com/cli/adduser )
magikMaker
funcionó para mí, gracias. Básicamente tenía un registro de nexus privado para mi lib pero mi Lib tiene otras dependencias que necesito instalar registry.npmjs.org, esto funcionó para mí
Chanuka Asanka
17

No es la mejor manera, pero si está utilizando Mac o Linux, incluso en Windows, puede establecer un 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/'
bawa g
fuente
2
Una solución similar es configurar un alias que pase la opción --register a npm. Esto tiene el mismo efecto, pero solo para el comando único. La sintaxis esalias npm-sin=npm --registry https://localhost:4873/
PatS
11

Como han pasado un par de años y no parece posible hacer esto (usando npm solo), una solución a este problema es usar el Administrador de repositorio Nexus (de Sonatype). Nexus admite múltiples repositorios, le permite ordenarlos y también servidores proxy / cachés para mejorar la velocidad.

Existe una versión gratuita y una versión pro / de pago. La característica que admite esto se describe en: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

La información relevante se duplica a continuación, de modo que si / cuando la URL / enlace anterior deja de funcionar, la información todavía está aquí.

Un grupo de repositorios es la forma recomendada de exponer todos sus repositorios de registros npm del administrador de repositorios a sus usuarios, sin necesidad de ninguna otra configuración del lado del cliente. Un grupo de repositorio le permite exponer el contenido agregado de múltiples repositorios proxy y alojados con una URL a npm y otras herramientas.

Te permite crear registros privados de npm

Se puede usar un registro privado de npm para cargar sus propios paquetes, así como paquetes de terceros.

Y

Para reducir las descargas duplicadas y mejorar las velocidades de descarga para sus desarrolladores y servidores CI, debe proxy el registro alojado en https://registry.npmjs.org . Por defecto, npm accede a este registro directamente. También puede delegar cualquier otro registro que necesite.

Entonces, una lista rápida con viñetas de las cosas que debe hacer para que esto funcione es:

  • Instalar Nexus

  • Cree un repositorio local / privado (o señale su repositorio privado en otro servidor)

  • Cree un GRUPO que enumere su repositorio privado y el repositorio público.

  • Configure su archivo $ HOME / .npmrc para que apunte al "GRUPO" que acaba de crear.

  • Publique sus paquetes privados de npm en el repositorio local.

  • Los usuarios ahora pueden ejecutar una configuración única.

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

  • Luego, los usuarios pueden instalar paquetes públicos o privados a través de npm install. npm install my-private-package npm install lodash any-other-public-package

Y tanto sus paquetes públicos como privados pueden instalarse mediante un simple npm installcomando. Nexus encuentra el paquete buscando cada repositorio configurado en el grupo y devuelve los resultados. Entonces, npm todavía piensa que solo hay un registro, pero detrás de la cortina hay varios repositorios que se utilizan.

NOTA IMPORTANTE: Cuando publique sus componentes, deberá especificar el npm publish --registry https://nexus/content/repositories/private-repo my-private-packagecomando para que su paquete se publique en el repositorio correcto.

PatS
fuente
¿Puedo configurar ambos registros (para desplegar mis propios artefactos y para extraer artefactos públicos) en el archivo .npmrc para que no tenga que mencionarlos cada vez que publico npm? Para empujar mis artefactos estoy usando un repositorio npm separado y para extraer todos los artefactos estoy usando un repositorio virtual. Ayúdame a configurar ambos en el archivo .npmrc.
Anshita Singh
1
@AnshitaSingh Acabo de pasar por esto. Si desea que yo tenga un repositorio diferente para publicar (por ejemplo, en npm-privatelugar de npm-group), puede anular la registrytecla en el package.jsonproyecto (consulte https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagespara más detalles). Si lo usa npm config set registry <url>, puede establecerlo en p npm-group. Ej. , Que contiene npm-registry(depósito de reenvío) y npm-private(su propio depósito). Usé esta solución, porque quitar los artefactos de GitLab CE local era demasiado complicado.
Igor
7

Puede usar la sintaxis de múltiples repositorios para la registryentrada en su .npmrcarchivo:

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

Eso haría que su npm busque paquetes en diferentes servidores.

Fernando Fernandes
fuente
Sí, pero los serverA, serverBy serverCrepositorios de ejemplo son todos de nuestra red interna, no funcionará para usted. No sé si es adecuado para usted, pero si lo cree, puede intentar implementar un Nexus Repository Manager para los repositorios internos.
Fernando Fernandes
1
de acuerdo con esta respuesta, la doble barra no tiene sentido, por lo que solo está configurando las teclas sin valores
PinguinoSod
1
Por lo que pude ver desde el lector de archivos de propiedad npm / ini, de hecho, el // se leerá como clave sin valor. Por cierto, al igual que las secciones de ámbito, se almacenará como servidores de registro secundarios. Entrarán en npm y se procesarán como servidores de configuración de registro de acuerdo con el algoritmo de evaluación interno de npm.
Fernando Fernandes
1
¿Alguien ha probado esta solución? ¿Funciona y ayuda a configurar un repositorio alternativo?
Luke P. Issac el
3

Algunos pasos que puedes probar. (es cómo lo hacemos en mi lugar de trabajo)

  • Cree un grupo de registro con dos (o más) direcciones de origen del repositorio. Uno sería su privado interno y el otro un proxy para npmjs dando prioridad al interno.
  • Haga de este grupo su registro en el archivo .npmrc. De esta manera, npm siempre intentará obtenerlo del interno, si no se encuentra, obténgalo del proxy

Espero que ayude.

Kaus Untwale
fuente
66
¿Cómo se crea un grupo de registro en npm? Qué significa eso?
Tuupertunut
1
Registro de @Tuupertunut La forma más fácil de hacerlo sería usar algún tipo de administrador de repositorio, como sonatype nexus. Puede alojar registros privados, proxy en npmjs, así como crear grupos de repositorios.
Kaus Untwale
1

Me encuentro con el mismo problema cuando mi empresa creó su propio registro, por lo que en gran medida la modificación relativa a proxy-registro en el proxy de-multi-registros para resolver este problema. Espero que también te ayude.

xymopen
fuente
1

A partir del 13 de abril de 2020, no existe tal funcionalidad a menos que pueda usar diferentes ámbitos, pero puede usar el script posterior a la instalación como solución alternativa. Siempre se ejecuta, bueno , después de cada instalación de npm :

Supongamos que tiene su .npmrc configurado para instalar @ foo-org / foo-pack-private desde su repositorio privado de github, pero el paquete público @ foo-org / foo-pack-public está en npm (bajo el mismo alcance: foo- org ).

Su postinstall podría verse así:

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

No olvide eliminar @ foo-pack / foo-org de la matriz de dependencias para asegurarse de que npm install no intente obtenerlo de github y agregar el indicador --dry-run que asegura que package.json y package- lock.json permanece sin cambios después de la instalación de npm .

Vasilescu Andrei
fuente
0

Mi enfoque fue hacer una ligera variante de línea de comando que agregue el interruptor de registro.

Creé estos archivos en la carpeta nodejs donde se encuentra el ejecutable npm:

npm-.cmd:

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

npm-:

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

Ahora, si quiero hacer una operación contra el registro npm normal (mientras no estoy conectado a la VPN), simplemente escribo npm-donde normalmente escribiría npm.

Para probar este comando y ver el registro de un paquete, use este ejemplo:

npm- view lodash

PD. Estoy en Windows y he probado esto en Bash, CMD y Powershell. Yo también

Mark Whitfeld
fuente