Esiste un modo per configurare più registri in un singolo file npmrc


143

Ecco il mio problema Abbiamo un registro NPM privato che funziona solo in VPN. Vorrei avere un registro di fallback https://registry.npmjs.org in modo che quando esco dalla VPN funzioni senza problemi.

PS Attualmente sto usando npmrc che fa un buon lavoro nel passaggio tra i file .npmrc come soluzione alternativa


8
Mi piacerebbe davvero sapere la stessa cosa. Forse il mio registro privato viene prima eseguito il ping e se fallisce il fallback nel registro pubblico (dal fallback locale, non una configurazione sul server privato). O alternativamente cambiare il mio registro in base al mio nome wifi.
ProLoser

1
per le anime perdute come me, un utile documento per npmrc
Andreas,

Risposte:


194

Puoi avere più registri per i pacchetti con ambito nel tuo .npmrcfile. Per esempio:

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

I pacchetti nell'ambito @polymerverranno ricevuti da https://registry.npmjs.org , ma il resto verrà ricevuto dall'NPM locale.


15
Grazie per questo consiglio Potresti dirlo, è possibile aggiungere l'autenticazione a questi registri con ambito? Perché ho bisogno della chiave _auth per il mio registro principale.
Bloomca,

3
Che cos'è un pacchetto con ambito? Non ne ho mai sentito parlare.
jcollum,

1
@jcollum, i pacchetti con ambito sono semplicemente pacchetti raggruppati (o con ambito) tramite uno spazio dei nomi. Consultare docs.npmjs.com/misc/scope per i dettagli. Lo scoping può essere usato per associare diversi pacchetti (come @angular), il che rende facile sapere che un pacchetto (@ angular / core) fa parte di Angular, ma potrebbe anche essere un'azienda come @ mycompany / mypackage.
PatS,

6
È possibile senza pacchetti con ambito? diciamo che se stiamo cercando questo pacchetto specifico andate in questo registro, altrimenti andate in quel registro
PinguinoSod

2
@PinguinoSod, No non è ancora possibile (a partire da dicembre 2019) per i pacchetti senza ambito. Sonatype è l'unica soluzione che conosco. Vedere stackoverflow.com/a/50995915/3281336
Pats

71

Nella versione 4.4.1, se è possibile modificare il nome del pacchetto, utilizzare:

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

Dov'è @mycol'ambito del pacchetto.

È possibile installare il pacchetto in questo modo:

npm install @myco/my-package

Per maggiori informazioni: https://docs.npmjs.com/misc/scope


È inoltre necessario avviare il pacchetto con l'ambito (npm init --scope = myco) e quindi pubblicarlo.
gjegadesh,

1
Ok ma come avere un fallback per quel registro
CharybdeBE

1
Ricevo Invalid package name "@npmjs/": name can only contain URL-friendly charactersquando corronpm i
umutesen,

Ho anche il nome può contenere solo errori di caratteri URL-friendly
katwhocodes

Questo approccio mi sembra più pulito. C'è un modo per farlo in package.json?
Hari Krishna Gaddipati,

19

Per chiunque cerchi anche una soluzione per l'autenticazione, aggiungerei sulla soluzione dei pacchetti con ambito che puoi avere più righe nel tuo .npmrcfile:

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

Ogni riga rappresenta un registro NPM diverso


4
Vorrei usare il comando npm login --registry=npm.example.com. Memorizzerà le credenziali di accesso (authTokens) nel file .npmrc nella cartella dell'utente, quindi non è necessario averlo nel codice sorgente ( docs.npmjs.com/cli/adduser )
magikMaker,

ha funzionato per me, grazie, registry.npmjs.org
praticamente avevo un registro di Nexus

17

Non è il modo migliore ma se stai usando mac o linux anche in Windows puoi impostare l'alias per diversi registri.

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

2
Una soluzione simile è quella di impostare un alias che passa l'opzione --registry a npm. Questo ha lo stesso effetto, ma solo per il singolo comando. La sintassi èalias npm-sin=npm --registry https://localhost:4873/
PatS

11

Dato che sono passati un paio d'anni e non sembra possibile farlo (usando solo npm), una soluzione a questo problema è usare Nexus Repository Manager (da Sonatype). Nexus supporta più repository, ti consente di ordinarli e anche proxy / cache per migliorare la velocità.

Esistono una versione gratuita e una versione pro / a pagamento. La funzione che supporta questo è descritta su: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

Le informazioni pertinenti sono duplicate di seguito, quindi se / quando l'URL / collegamento sopra smette di funzionare, le informazioni sono ancora qui.

Un gruppo di repository è il modo consigliato per esporre tutti i repository dei registri npm dal gestore repository ai propri utenti, senza che sia necessaria alcuna ulteriore configurazione lato client. Un gruppo di repository consente di esporre il contenuto aggregato di più proxy e repository ospitati con un URL a npm e altri strumenti.

Ti permette di creare registri npm privati

Un registro privato npm può essere utilizzato per caricare i propri pacchetti e pacchetti di terze parti.

E

Per ridurre i download duplicati e migliorare la velocità di download per sviluppatori e server CI, è necessario eseguire il proxy del registro ospitato su https://registry.npmjs.org . Per impostazione predefinita, npm accede direttamente a questo registro. Puoi anche eseguire il proxy di tutti gli altri registri richiesti.

Quindi un rapido elenco puntato di cose che fai per farlo funzionare è:

  • Installa Nexus

  • Creare un repository locale / privato (o puntare al repository privato su un altro server)

  • Crea un GRUPPO che elenca il tuo repository privato e il repository pubblico.

  • Configura il tuo file $ HOME / .npmrc in modo che punti al "GRUPPO" appena creato.

  • Pubblica i tuoi pacchetti npm privati ​​nel repository locale.

  • Gli utenti ora possono eseguire una configurazione singola.

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

  • Quindi gli utenti possono installare pacchetti sia pubblici che privati ​​tramite npm install. npm install my-private-package npm install lodash any-other-public-package

E i tuoi pacchetti sia pubblici che privati ​​possono essere installati con un semplice npm installcomando. Nexus trova il pacchetto che cerca ciascun repository configurato nel gruppo e restituisce i risultati. Quindi npm pensa ancora che ci sia un solo registro ma dietro il sipario ci sono più repository utilizzati.

NOTA IMPORTANTE: quando si pubblicano i componenti, è necessario specificare il npm publish --registry https://nexus/content/repositories/private-repo my-private-packagecomando in modo che il pacchetto sia pubblicato nel repository corretto.


posso configurare entrambi i registri (per distribuire i miei artefatti e per estrarre artefatti pubblici) nel file .npmrc in modo che non debba essere menzionato ogni volta che sto facendo npm publishing? Per spingere i miei artefatti sto usando un repository npm separato e per estrarre tutti i manufatti che sto usando un repository virtuale. Aiutatemi a configurare entrambi nel file .npmrc.
Anshita Singh,

1
@AnshitaSingh Ho appena passato questo. Se ti piaccio ho un repository diverso per la pubblicazione (ad es. npm-privateInvece di npm-group), puoi sovrascrivere il registrytasto - chiave nel package.jsontuo progetto (vedi https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesper i dettagli). Usandolo npm config set registry <url>puoi impostarlo su eg npm-group, che contiene npm-registry(repository di inoltro) e npm-private(il tuo repository). Ho usato questa soluzione, perché rimuovere gli artefatti dal GitLab CE locale era troppo complicato.
Igor

7

È possibile utilizzare la sintassi di più repository per la registryvoce nel .npmrcfile:

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

Ciò renderebbe il tuo npm alla ricerca di pacchetti in server diversi.


Sì, ma i repository serverA, serverBed serverCesempio, provengono tutti dalla nostra rete interna, non funzioneranno per te. Non so se è adatto a te, ma se pensi che sia, puoi provare a distribuire un Nexus Repository Manager per i repository interni.
Fernando Fernandes,

1
secondo questa risposta la doppia barra non ha alcun significato, quindi stai semplicemente impostando le chiavi senza valori
PinguinoSod

1
Per quanto ho potuto vedere dal lettore di file delle proprietà npm / ini, in effetti // verrà letto come chiave senza valore. A proposito, come le sezioni con ambito, verrà memorizzato come server di registro secondari. Entreranno in npm e saranno elaborati come server di configurazione del registro secondo l'algoritmo di valutazione interno di npm.
Fernando Fernandes,

1
Qualcuno ha provato questa soluzione. Funziona e aiuta a configurare un repository di fallback?
Luke P. Issac,

3

Alcuni passaggi che puoi provare. (è come lo facciamo sul mio posto di lavoro)

  • Creare un gruppo di registro con due (o più) indirizzi di origine del repository. Uno sarebbe il tuo interno privato e l'altro un proxy per npmjs dando priorità a quello interno.
  • Imposta questo gruppo come registro nel file .npmrc. In questo modo npm cercherà sempre di ottenerlo da quello interno, se non trovato lo ottenga dal proxy

Spero che aiuti.


6
Come si crea un gruppo di registro in npm? Cosa significa?
Tuupertunut,

1
Registro @Tuupertunut Il modo più semplice per farlo sarebbe usare una sorta di gestore di repository, come sonatype nexus. Può ospitare registri privati, proxy in npmjs e creare gruppi di repository.
Kaus Untwale,



1

A partire dal 13 aprile 2020 tale funzionalità non è disponibile se non si è in grado di utilizzare ambiti diversi, ma è possibile utilizzare lo script postinstallazione come soluzione alternativa. Viene sempre eseguito, bene , dopo ogni installazione di npm :

Supponi di avere il tuo .npmrc configurato per installare @ foo-org / foo-pack-private dal tuo repository github privato, ma il pacchetto pubblico @ foo-org / foo-pack-public è su npm (sotto lo stesso ambito: foo- org ).

La tua postinstallazione potrebbe apparire così:

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

Non dimenticare di rimuovere @ foo-pack / foo-org dal dipendenze array per assicurarsi NPM installare non cercare di ottenere da github e di aggiungere il --dry-run bandiera che consente di verificare package.json e pacchetto- lock.json rimane invariato dopo l'installazione di npm .


0

Il mio approccio è stato quello di creare una leggera variante della riga di comando che aggiunge l'opzione di registro.

Ho creato questi file nella cartella nodejs dove si trova l'eseguibile npm:

npm-.cmd:

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

npm-:

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

Ora, se voglio fare un'operazione contro il normale registro npm (mentre non sono connesso alla VPN), scrivo solo npm-dove normalmente digitare npm.

Per testare questo comando e vedere il registro per un pacchetto, usare questo esempio:

npm- view lodash

PS. Sono su Windows e l'ho testato su Bash, CMD e Powershell. anche io

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.