Gibt es eine Möglichkeit, mehrere Registrierungen in einer einzigen npmrc-Datei zu konfigurieren?


143

Hier ist mein Problem. Wir haben eine private NPM-Registrierung, die nur in VPN funktioniert. Ich hätte gerne eine Fallback-Registrierung https://registry.npmjs.org, damit sie nahtlos funktioniert, wenn ich kein VPN mehr habe.

PS Derzeit verwende ich npmrc, das beim Umschalten zwischen .npmrc-Dateien als Problemumgehung gute Arbeit leistet


8
Ich würde eigentlich gerne das Gleiche wissen. Vielleicht wird entweder meine private Registrierung zuerst gepingt und wenn sie fehlschlägt, wird auf die öffentliche Registrierung zurückgegriffen (vom lokalen Fallback, nicht von einem Setup auf dem privaten Server). Oder alternativ meine Registrierung basierend auf meinem WLAN-Namen wechseln.
ProLoser

1
Für verlorene Seelen wie mich ein nützliches Dokument für npmrc
Andreas

Antworten:


194

Sie können mehrere Registrierungen für Pakete mit Gültigkeitsbereich in Ihrer .npmrcDatei haben. Beispielsweise:

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

Pakete im @polymerGeltungsbereich werden von https://registry.npmjs.org empfangen , der Rest wird von Ihrem lokalen NPM empfangen.


15
Vielen Dank für diesen Rat. Könnten Sie bitte sagen, ob es möglich ist, diesen Gültigkeitsregistern eine Authentifizierung hinzuzufügen? Weil ich den _auth-Schlüssel für meine Hauptregistrierung benötige.
Bloomca

2
Was ist ein Umfangspaket? Ich habe noch nie davon gehört.
JCollum

1
@jcollum, Pakete mit Gültigkeitsbereich sind einfach Pakete, die über einen Namespace gruppiert (oder mit Gültigkeitsbereich) sind. Weitere Informationen finden Sie unter docs.npmjs.com/misc/scope . Mit Scoping können mehrere Pakete (wie @angular) verknüpft werden, wodurch leicht zu erkennen ist, dass ein Paket (@ angle / core) Teil von Angular ist, aber auch ein Unternehmen wie @ mycompany / mypackage sein kann.
PatS

6
Ist dies ohne Umfangspakete möglich?
Nehmen

2
@PinguinoSod, Nein, es ist immer noch (Stand Dezember 2019) nicht möglich für Pakete ohne Gültigkeitsbereich. Sonatype ist die einzige mir bekannte Lösung. Siehe stackoverflow.com/a/50995915/3281336
PatS

71

Wenn Sie in Version 4.4.1 den Paketnamen ändern können, verwenden Sie:

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

Wo @mycoist Ihr Paketumfang?

Sie können das Paket folgendermaßen installieren:

npm install @myco/my-package

Für weitere Informationen: https://docs.npmjs.com/misc/scope


Es ist auch erforderlich, Ihr Paket mit dem Gültigkeitsbereich (npm init --scope = myco) zu initiieren und anschließend zu veröffentlichen.
Gjegadesh

1
Ok, aber wie haben Sie einen Fallback für diese Registrierung
CharybdeBE

1
Ich Invalid package name "@npmjs/": name can only contain URL-friendly charactersnpm i
bekomme

Ich habe auch den Namen kann nur URL-freundliche Zeichen Fehler enthalten
Katwhocodes

Dieser Ansatz sieht für mich sauberer aus. Gibt es eine Möglichkeit, dies in package.json zu tun?
Hari Krishna Gaddipati

19

Für alle, die auch nach einer Lösung für die Authentifizierung suchen, würde ich die Lösung für Pakete mit Gültigkeitsbereich hinzufügen, bei der Ihre .npmrcDatei mehrere Zeilen enthalten kann:

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

Jede Zeile repräsentiert eine andere NPM-Registrierung


4
Ich würde den Befehl verwenden npm login --registry=npm.example.com. Die Anmeldeinformationen (authTokens) werden in der .npmrc-Datei in Ihrem Benutzerordner gespeichert, sodass Sie sie nicht im Quellcode ( docs.npmjs.com/cli/adduser ) haben müssen
magikMaker

es hat bei mir funktioniert, danke. Grundsätzlich hatte ich eine private Nexus-Registrierung für meine Bibliothek, aber meine Bibliothek hat noch ein paar Abhängigkeiten, die installiert werden registry.npmjs.orgmüssen. Dies hat bei mir
funktioniert

17

Nicht der beste Weg, aber wenn Sie Mac oder Linux auch unter Windows verwenden, können Sie einen Alias ​​für verschiedene Registrierungen festlegen.

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

2
Eine ähnliche Lösung besteht darin, einen Alias ​​einzurichten, der die Option --registry an npm übergibt. Dies hat den gleichen Effekt, jedoch nur für den einzelnen Befehl. Syntax istalias npm-sin=npm --registry https://localhost:4873/
PatS

11

Da dies einige Jahre her ist und dies nicht möglich zu sein scheint (nur mit npm), besteht eine Lösung für dieses Problem darin, den Nexus Repository Manager (von Sonatype) zu verwenden. Nexus unterstützt mehrere Repositorys, mit denen Sie sie bestellen können, sowie Proxys / Caches, um die Geschwindigkeit zu verbessern.

Es gibt eine kostenlose Version und eine Pro / Paid-Version. Die Funktion, die dies unterstützt, wird unter https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries beschrieben

Die relevanten Informationen werden unten dupliziert. Wenn also die obige URL / der obige Link nicht mehr funktioniert, sind die Informationen immer noch hier.

Eine Repository-Gruppe ist die empfohlene Methode, um alle Ihre npm-Registrierungs-Repositorys aus dem Repository-Manager für Ihre Benutzer verfügbar zu machen, ohne dass eine weitere clientseitige Konfiguration erforderlich ist. Mit einer Repository-Gruppe können Sie den aggregierten Inhalt mehrerer Proxy- und gehosteter Repositorys mit einer URL zu npm und anderen Tools verfügbar machen.

Sie können damit private npm-Register erstellen

Eine private npm-Registrierung kann verwendet werden, um Ihre eigenen Pakete sowie Pakete von Drittanbietern hochzuladen.

Und

Um doppelte Downloads zu reduzieren und die Download-Geschwindigkeit für Ihre Entwickler und CI-Server zu verbessern, sollten Sie die unter https://registry.npmjs.org gehostete Registrierung als Proxy verwenden . Standardmäßig greift npm direkt auf diese Registrierung zu. Sie können auch alle anderen von Ihnen benötigten Registries vertreten.

Eine kurze Liste der Dinge, die Sie tun, um dies zum Laufen zu bringen, lautet also:

  • Installieren Sie Nexus

  • Erstellen Sie ein lokales / privates Repo (oder zeigen Sie auf Ihr privates Repo auf einem anderen Server).

  • Erstellen Sie eine GRUPPE, in der Ihr privates Repo und das öffentliche Repo aufgelistet sind.

  • Konfigurieren Sie Ihre $ HOME / .npmrc-Datei so, dass sie auf die gerade erstellte "GROUP" verweist.

  • Veröffentlichen Sie Ihre privaten npm-Pakete im lokalen Repo.

  • Benutzer können jetzt ein einmaliges Setup ausführen.

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

  • Dann können Benutzer sowohl öffentliche als auch private Pakete über installieren npm install. npm install my-private-package npm install lodash any-other-public-package

Und sowohl Ihre öffentlichen als auch Ihre privaten Pakete können mit einem einfachen npm installBefehl installiert werden . Nexus findet das Paket, das jedes in der Gruppe konfigurierte Repo durchsucht, und gibt die Ergebnisse zurück. Npm glaubt also immer noch, dass es nur eine Registrierung gibt, aber hinter dem Vorhang werden mehrere Repos verwendet.

WICHTIGER HINWEIS: Wenn Sie Ihre Komponenten veröffentlichen, müssen Sie den npm publish --registry https://nexus/content/repositories/private-repo my-private-packageBefehl angeben, damit Ihr Paket im richtigen Repo veröffentlicht wird.


Kann ich beide Registrierungen (zum Bereitstellen meiner eigenen Artefakte und zum Abrufen öffentlicher Artefakte) in der .npmrc-Datei konfigurieren, damit ich nicht jedes Mal erwähnen muss, wenn ich npm veröffentliche? Zum Verschieben meiner Artefakte verwende ich ein separates npm-Repository und zum Abrufen aller Artefakte verwende ich ein virtuelles Repository. Bitte helfen Sie mir, beide in der .npmrc-Datei zu konfigurieren.
Anshita Singh

1
@ AnshitaSingh Ich habe das gerade durchgemacht. Wenn Sie möchten , dass ich ein anderes Repository zum Veröffentlichen habe (z. B. npm-privateanstelle von npm-group), können Sie den registrySchlüssel in package.jsonIhrem Projekt überschreiben (siehe https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesDetails). Mit npm config set registry <url>können Sie z. B. festlegen npm-group, welches npm-registry(Weiterleitungs-Repository) und npm-private(Ihr eigenes Repository) enthält. Ich habe diese Lösung verwendet, weil das Entfernen von Artefakten aus dem lokalen GitLab CE zu kompliziert war.
Igor

6

Sie können die Syntax mehrerer Repositorys für den registryEintrag in Ihrer .npmrcDatei verwenden:

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

Das würde Ihre npm dazu bringen, nach Paketen auf verschiedenen Servern zu suchen.


Ja, aber die serverA, serverBund serverCBeispiel - Repositorys sind alle aus unserem internen Netzwerk nicht funktioniert für Sie. Ich weiß nicht, ob es für Sie geeignet ist, aber wenn Sie glauben, dass dies der Fall ist, können Sie versuchen, einen Nexus Repository Manager für die internen Repos bereitzustellen.
Fernando Fernandes

1
Entsprechend dieser Antwort hat der doppelte Schrägstrich keine Bedeutung, so dass Sie nur die Tasten ohne Werte setzen
PinguinoSod

1
Soweit ich vom npm / ini-Eigenschaftendateireader sehen konnte, wird das // tatsächlich als Schlüssel ohne Wert gelesen. Übrigens wird es wie die Bereiche mit Gültigkeitsbereich als sekundärer Registrierungsserver gespeichert. Sie werden in npm aufgenommen und entsprechend dem internen Bewertungsalgorithmus von npm als Registrierungskonfigurationsserver verarbeitet.
Fernando Fernandes

1
Hat jemand diese Lösung ausprobiert. Funktioniert es und hilft es, ein Fallback-Repository zu konfigurieren?
Luke P. Issac

3

Einige Schritte können Sie versuchen. (so machen wir das an meinem Arbeitsplatz)

  • Erstellen Sie eine Registrierungsgruppe mit zwei (oder mehr) Repository-Quelladressen. Einer wäre Ihr interner privater und der andere ein Proxy für npmjs, der dem internen Priorität einräumt.
  • Machen Sie diese Gruppe zu Ihrer Registrierung in der .npmrc-Datei. Auf diese Weise versucht npm immer, es vom internen zu erhalten, wenn es nicht gefunden wird, vom Proxy

Hoffentlich hilft das.


6
Wie erstellt man eine Registrierungsgruppe in npm? Was bedeutet das?
Tuupertunut

1
@ Tuupertunut-Registrierung Der einfachste Weg, dies zu tun, wäre die Verwendung eines Repository-Managers wie Sonatype Nexus. Es kann private Registrierungen, Proxys in npmjs hosten sowie Repository-Gruppen erstellen.
Kaus Untwale



1

Ab dem 13. April 2020 gibt es keine solche Funktionalität, es sei denn, Sie können verschiedene Bereiche verwenden, aber Sie können das Postinstall- Skript als Problemumgehung verwenden . Es wird immer ausgeführt und nach jedem npm installieren :

Angenommen, Sie haben Ihre .npmrc so konfiguriert, dass sie @ foo-org / foo-pack-private von Ihrem privaten Github-Repo installiert, aber das öffentliche Paket @ foo-org / foo-pack-public befindet sich auf npm (im selben Bereich: foo- org ).

Ihre Nachinstallation könnte folgendermaßen aussehen:

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

Vergessen Sie nicht, @ foo-pack / foo-org aus dem Abhängigkeitsarray zu entfernen , um sicherzustellen, dass die npm-Installation nicht versucht, es von github abzurufen, und das Flag --dry-run hinzuzufügen, das sicherstellt , dass package.json und package- lock.json bleibt nach der Installation von npm unverändert .


0

Mein Ansatz war es, eine leichte Befehlszeilenvariante zu erstellen, die den Registrierungsschalter hinzufügt.

Ich habe diese Dateien im Ordner nodejs erstellt, in dem sich die ausführbare Datei npm befindet:

npm-.cmd::

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

npm-::

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

Wenn ich jetzt eine Operation gegen die normale npm-Registrierung ausführen möchte (während ich nicht mit dem VPN verbunden bin), tippe ich einfach dort, npm-wo ich normalerweise tippe npm.

Verwenden Sie dieses Beispiel, um diesen Befehl zu testen und die Registrierung für ein Paket anzuzeigen:

npm- view lodash

PS. Ich bin in Windows und habe dies in Bash, CMD und Powershell getestet. ich auch

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.