web-dev-qa-db-fra.com

Puis-je exécuter un référentiel npm privé sans répliquer le référentiel public?

J'écris un certain nombre de morceaux de code (à usage interne) en utilisant node.js et je veux stocker les modules (empaquetés pour npm) dans un référentiel de packages pour chaque distribution sur les différentes machines sur lesquelles ils seront installés.

Idéalement, j'aimerais une solution similaire aux référentiels apt de Debian dans laquelle je peux exécuter un serveur de référentiel privé et configurer npm pour utiliser une liste de référentiels à installer à partir de (lors de l'installation de "foo", si "foo" est connu de mon serveur, installez-le à partir de là, sinon installez-le à partir du serveur public).

Cependant, il semble que la clé de configuration npm registry n'accepte qu'une seule URL.

Existe-t-il un moyen de réaliser ce que je veux?

Les plus proches que j'ai pu trouver ont été:

  • Mettre en miroir le référentiel public localement et ajouter mes packages par-dessus… mais je ne veux pas conserver cette quantité de données (2.5G et toujours en téléchargement) répliquées sur AWS.
  • Héberger tous mes packages dans des référentiels git et les installer à partir de là (ce qui est plus compliqué).
  • Héberger des packages statiques sur HTTP (pour autant que je sache, cela m'empêcherait d'obtenir automatiquement "la dernière version". Je suppose que je pourrais faire quelque chose avec des liens symboliques, mais qui est toujours moins flexible que git, nécessite des URL complètes (qui nécessitent à tenir à jour), et ne donne pas un référentiel consultable.
36
Quentin

Je viens de mettre cela en place pour mon travail. Voici ce que j'ai fait:

  1. Configuration du registre NPM vide : J'ai suivi les instructions de ce fork de npmjs.org, qui ajoute beaucoup documentation améliorée .

  2. Configuration de Kappa : J'ai utilisé Kappa , un excellent proxy npm de Paypal. (Je suppose qu'ils ont un cas d'utilisation très similaire à la plupart des gens qui veulent un référentiel privé; c'est exactement ce que je voulais).

  3. Configuration de npm_lazy ( facultatif): Je voulais un joli cache de paquets fréquemment utilisés au cas où npmjs.org tomberait, j'ai donc ajouté npm_lazy devant le tout, comme couche de mise en cache.

Le tout a pris deux jours (ish) pour être opérationnel. En guise de remarque, si vous craignez que des personnes accèdent au registre public par accident, je vous recommande d'ajouter ceci à votre package.json:

"publishConfig": { "registry": "http://my-registry.example.com" },

Ce n'est vraiment qu'un peu de paranoïa; une fois que vous avez configuré votre npm pour pointer vers votre instance Kappa/npm_lazy, Kappa gère la publication vers votre référentiel privé pour vous.

Remarque: Kappa ne publiera que chaque publication dans le premier référentiel de sa configuration. Si vous devez publier à la fois dans votre registre privé et auprès du public, vous devrez élaborer votre propre solution.

33
Chris Case

Dans votre package.json, vous pouvez utiliser n'importe quelle URL qui pointe vers un module compressé npm valide. J'utilise un s3 avec un nom de bucket difficile à deviner.

npm pack
s3cmd put *.tgz s3://path-to-your bucket

S3 n'est qu'un exemple, vous pouvez utiliser n'importe quel moyen pouvant placer un fichier sur un serveur Web, il peut même être protégé via une authentification de base.

6
Pascal Belloncle

Je crois que le projet Kappa de Paypal conviendrait à votre besoin.

Voici un article décrivant le projet Kraken de Paypal et comment Kappa s'intègre.

Je comprends que ce n'était pas disponible au moment de la question de Quentin, mais peut-être que cela sera utile pour d'autres qui viennent ici.

3
user605331

npm-registry-client Le numéro 42 de GitHub répertorie plusieurs façons de créer votre propre miroir de référentiel. à savoir:

Dans l'ensemble, il me semble que vous pouvez obtenir les meilleures réponses en recherchant dans les référentiels appartenant à https://github.com/npm ou en posant votre question là-bas

3
xmojmr

Basé uniquement sur l'écoute d'un épisode récent de NodeUp (# 37?), Je pense que vous voudrez peut-être jeter un œil à irisnpm . D'après ce dont je me souviens, c'est un service qui vous donne un ensemble fusionné de modules publics et de vos propres modules privés.

1
David Weldon

Comme l'a suggéré Dominic Barnes, nous ne pouvons reproduire que _design documents (schémas de table CouchDB)

Comment reproduire uniquement les documents de conception?

Cependant, il doit vérifier si certaines données sont nécessaires.

0
Paul Verest

Vous pouvez répliquer les modules dont vous avez besoin, puis écrire un serveur proxy qui recherche un module dans votre réplication. Si un module n'existe pas, il pourrait diriger la demande vers NPM et retourner le résultat à partir de là.

0
pvorb