Existe-t-il un moyen de configurer plusieurs registres dans un seul fichier npmrc

143

Voici mon problème. Nous avons un registre NPM privé qui ne fonctionne qu'en VPN. J'aimerais avoir un registre de secours https://registry.npmjs.org afin que, lorsque je suis hors de VPN, cela fonctionne de manière transparente.

PS Actuellement, j'utilise npmrc qui fait un bon travail pour basculer entre les fichiers .npmrc comme solution de contournement

Abhijit Mazumder
la source
8
J'aimerais vraiment savoir la même chose. Peut-être que mon registre privé est d'abord envoyé par ping et s'il échoue, le repli vers le registre public (à partir de la solution de secours locale, pas d'une configuration sur le serveur privé). Ou encore changer mon registre en fonction de mon nom wifi.
ProLoser
1
pour les âmes perdues comme moi, un doc utile au npmrc
Andreas

Réponses:

194

Vous pouvez avoir plusieurs registres pour les packages étendus dans votre .npmrcfichier. Par exemple:

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

Les packages @polymerconcernés seront reçus de https://registry.npmjs.org , mais le reste sera reçu de votre NPM local.

José Alberto Ruiz
la source
15
Merci pour ce conseil. Pourriez-vous s'il vous plaît dire, est-il possible d'ajouter une authentification à ces registres étendus? Parce que j'ai besoin de la clé _auth pour mon registre principal.
Bloomca
3
Qu'est-ce qu'un package étendu? Je n'en ai jamais entendu parler.
jcollum
1
@jcollum, les packages Scoped sont simplement des packages qui sont groupés (ou scoped) via un espace de noms. Voir docs.npmjs.com/misc/scope pour plus de détails. La portée peut être utilisée pour associer plusieurs packages (comme @angular), ce qui permet de savoir facilement qu'un package (@ angular / core) fait partie d'Angular, mais pourrait aussi être une entreprise comme @ mycompany / mypackage.
PatS
6
Est-ce possible sans packages étendus? disons que si nous recherchons ce package spécifique, allez dans ce registre, sinon allez dans ce registre
PinguinoSod
2
@PinguinoSod, Non, cela n'est toujours pas possible (à partir de décembre 2019) pour les packages sans portée. Sonatype est la seule solution que je connaisse. Voir stackoverflow.com/a/50995915/3281336
PatS
71

Sur la version 4.4.1, si vous pouvez changer le nom du package, utilisez:

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

@mycoest la portée de votre package.

Vous pouvez installer le package de cette manière:

npm install @myco/my-package

Pour plus d'informations: https://docs.npmjs.com/misc/scope

Gilberto Alexandre
la source
Il est également nécessaire d'initier votre package avec la portée (npm init --scope = myco), puis de le publier.
gjegadesh
1
Ok mais comment avoir une solution de secours pour ce registre
CharybdeBE
1
Je reçois Invalid package name "@npmjs/": name can only contain URL-friendly charactersquand je coursnpm i
umutesen
J'ai aussi le nom ne peut contenir qu'une erreur de caractères conviviaux pour les URL
katwhocodes
Cette approche me paraît plus propre. Existe-t-il un moyen de le faire dans package.json?
Hari Krishna Gaddipati le
19

Pour tous ceux qui recherchent également une solution d'authentification, j'ajouterais à la solution des packages étendus que vous pouvez avoir plusieurs lignes dans votre .npmrcfichier:

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

Chaque ligne représente un registre NPM différent

Gregra
la source
4
J'utiliserais la commande npm login --registry=npm.example.com. Il stockera les informations de connexion (authTokens) dans le fichier .npmrc de votre dossier utilisateur, vous n'avez donc pas besoin de les avoir dans le code source ( docs.npmjs.com/cli/adduser )
magikMaker
cela a fonctionné pour moi, merci, Fondamentalement, j'avais un registre de nexus privé pour ma lib mais ma lib a quelques autres dépendances qui doivent être installées registry.npmjs.org, cela a fonctionné pour moi
Chanuka Asanka
17

Ce n'est pas le meilleur moyen, mais si vous utilisez mac ou linux même sous Windows, vous pouvez définir des alias pour différents registres.

##############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
la source
2
Une solution similaire consiste à configurer un alias qui transmet l'option --registry à npm. Cela a le même effet, mais uniquement pour la commande unique. La syntaxe estalias npm-sin=npm --registry https://localhost:4873/
PatS
11

Comme cela fait quelques années et qu'il ne semble pas possible de le faire (en utilisant npm seul), une solution à ce problème est d'utiliser le Nexus Repository Manager (de Sonatype). Nexus prend en charge plusieurs référentiels, vous permet de les ordonner, ainsi que des proxys / caches pour améliorer la vitesse.

Une version gratuite et une version pro / payante existent. La fonctionnalité qui prend en charge cela est décrite à l' adresse : https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

Les informations pertinentes sont dupliquées ci-dessous, donc si / lorsque l'URL / lien ci-dessus cesse de fonctionner, les informations sont toujours là.

Un groupe de référentiels est le moyen recommandé pour exposer tous vos référentiels de registres npm du gestionnaire de référentiels à vos utilisateurs, sans avoir besoin de configuration supplémentaire côté client. Un groupe de référentiels vous permet d'exposer le contenu agrégé de plusieurs référentiels proxy et hébergés avec une URL vers npm et d'autres outils.

Il vous permet de créer des registres npm privés

Un registre npm privé peut être utilisé pour télécharger vos propres packages ainsi que des packages tiers.

Et

Pour réduire les téléchargements en double et améliorer les vitesses de téléchargement pour vos développeurs et serveurs CI, vous devez utiliser le proxy du registre hébergé sur https://registry.npmjs.org . Par défaut, npm accède directement à ce registre. Vous pouvez également proxy pour tout autre registre dont vous avez besoin.

Voici donc une petite liste à puces des choses que vous faites pour que cela fonctionne:

  • Installez Nexus

  • Créez un dépôt local / privé (ou pointez vers votre dépôt privé sur un autre serveur)

  • Créez un GROUPE qui répertorie votre dépôt privé et le dépôt public.

  • Configurez votre fichier $ HOME / .npmrc pour qu'il pointe vers le "GROUPE" que vous venez de créer.

  • Publiez vos packages npm privés dans le référentiel local.

  • Les utilisateurs peuvent désormais exécuter une configuration unique.

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

  • Les utilisateurs peuvent ensuite installer des packages publics ou privés via npm install. npm install my-private-package npm install lodash any-other-public-package

Et vos packages publics et privés peuvent être installés via une simple npm installcommande. Nexus trouve le package recherchant chaque dépôt configuré dans le groupe et renvoie les résultats. Donc npm pense toujours qu'il n'y a qu'un seul registre, mais derrière le rideau, plusieurs dépôts sont utilisés.

REMARQUE IMPORTANTE: lorsque vous publiez vos composants, vous devrez spécifier la npm publish --registry https://nexus/content/repositories/private-repo my-private-packagecommande afin que votre package soit publié dans le référentiel approprié.

PatS
la source
puis-je configurer à la fois le registre (pour le déploiement de mes propres artefacts et pour l'extraction des artefacts publics) dans le fichier .npmrc afin de ne pas avoir à le mentionner à chaque fois que je publie npm? Pour pousser mes artefacts, j'utilise un référentiel npm séparé et pour extraire tous les artefacts, j'utilise un référentiel virtuel. Veuillez m'aider à configurer les deux dans le fichier .npmrc.
Anshita Singh
1
@AnshitaSingh Je viens de traverser ça. Si vous comme moi avez un référentiel différent pour la publication (par exemple npm-privateau lieu de npm-group), vous pouvez remplacer la registryclé dans le package.jsonde votre projet (voir https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagespour plus de détails). En utilisant, npm config set registry <url>vous pouvez le définir sur, par exemple npm-group, qui contient npm-registry(référentiel de transfert) et npm-private(votre propre référentiel). J'ai utilisé cette solution, car extraire des artefacts de GitLab CE local était trop compliqué.
Igor
7

Vous pouvez utiliser la syntaxe de plusieurs référentiels pour l' registryentrée dans votre .npmrcfichier:

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

Cela inciterait votre npm à rechercher des packages dans différents serveurs.

Fernando Fernandes
la source
Oui, mais les serverA, serverBet par serverCexemple les dépôts sont de notre réseau interne, ne fonctionnera pas pour vous. Je ne sais pas si cela vous convient, mais si vous pensez que c'est le cas, vous pouvez essayer de déployer un Nexus Repository Manager pour les dépôts internes.
Fernando Fernandes
1
selon cette réponse, la double barre oblique n'a pas de sens, vous ne faites donc que définir les clés sans valeurs
PinguinoSod
1
Autant que je puisse voir du lecteur de fichier de propriété npm / ini, en effet, le // sera lu comme une clé sans valeur. À propos, comme les sections de portée, il sera stocké en tant que serveurs de registre secondaires. Ils entreront dans npm et seront traités comme des serveurs de configuration de registre conformément à l'algorithme d'évaluation interne de npm.
Fernando Fernandes
1
Quelqu'un a-t-il essayé cette solution. Cela fonctionne-t-il et aide-t-il à configurer un référentiel de secours?
Luke P. Issac le
3

Quelques étapes que vous pouvez essayer. (c'est comme ça qu'on fait sur mon lieu de travail)

  • Créez un groupe de registre avec deux adresses source de référentiel (ou plus). L'un serait votre privé interne et l'autre un proxy vers npmjs donnant la priorité à l'interne.
  • Faites de ce groupe votre registre dans le fichier .npmrc. De cette façon, npm essaiera toujours de l'obtenir à partir de l'interne, s'il n'est pas trouvé, récupérez-le du proxy

J'espère que cela pourra aider.

Kaus Untwale
la source
6
Comment créer un groupe de registre dans npm? Qu'est-ce que ça veut dire?
Tuupertunut
1
Registre @Tuupertunut Le moyen le plus simple de le faire serait d'utiliser une sorte de gestionnaire de référentiel, comme sonatype nexus. Il peut héberger des registres privés, un proxy dans npmjs ainsi que créer des groupes de référentiels.
Kaus Untwale
1

Je rencontre le même problème lorsque mon entreprise met en place son propre registre, donc je retravaille fortement le proxy-registre en proxy-multi-registres pour résoudre ce problème. J'espère que cela vous aidera également.

xymopen
la source
1

À partir du 13 avril 2020, cette fonctionnalité n'existe pas à moins que vous ne puissiez utiliser différentes étendues, mais vous pouvez utiliser le script de post - installation comme solution de contournement. Il est toujours exécuté, eh bien , après chaque installation de npm :

Supposons que votre .npmrc soit configuré pour installer @ foo-org / foo-pack-private à partir de votre dépôt github privé, mais que le package public @ foo-org / foo-pack-public est sur npm (sous la même portée: foo- org ).

Votre post - installation pourrait ressembler à ceci:

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

N'oubliez pas de supprimer @ foo-pack / foo-org du tableau des dépendances pour vous assurer que npm install n'essaye pas de l'obtenir depuis github et d'ajouter le drapeau --dry-run qui s'assure que package.json et package- lock.json reste inchangé après l' installation de npm .

Vasilescu Andrei
la source
0

Mon approche a été de créer une légère variante de ligne de commande qui ajoute le commutateur de registre.

J'ai créé ces fichiers dans le dossier nodejs où se trouve l'exécutable npm:

npm-.cmd:

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

npm-:

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

Maintenant, si je veux faire une opération sur le registre npm normal (alors que je ne suis pas connecté au VPN), je tape simplement npm-là où je taperais habituellementnpm .

Pour tester cette commande et voir le registre pour un package, utilisez cet exemple:

npm- view lodash

PS. Je suis dans Windows et j'ai testé cela dans Bash, CMD et Powershell. moi aussi

Mark Whitfeld
la source