Blog

Déployer des librairies privées npm

Utiliser Nexus comme registre npm

Au cours de récents développements Angular 2 dans mon équipe, nous avons voulu créer des composants réutilisables dans plusieurs projets. Il s’agissait de composants simples comme des composants de sélection de dates, ou plus complexes, comme des blocs de formulaires répétés sur plusieurs projets.

npm-deploy
Afin d’éviter la duplication de code, j’ai cherché à créer des libraires privées npm, embarquant du css et des composants Angular. Le but était de récupérer nos composants sous forme de dépendance npm dans plusieurs projets, de la même façon qu’on récupère des libraires publiques dans un projet Angular : en ajoutant la librairie dans la balise dependencies du package.json

J’ai étudié les diverses solutions possibles pour déployer des librairies privées npm. Le but est de stocker toutes les librairies dont on a besoin sur un seul registre : les librairies privées, et celles qui viennent du registre par défaut registry.npmjs.org

La société npm propose une solution hébergée : npm Organizations.
Aucune installation interne n’est requise. Les serveurs sont administrés par npm.
Le prix est 7 euros par mois et par utilisateur : c’est un utilisateur au sens GitHub, c’est-à-dire un développeur qui va importer la librairie dans son projet.
Selon la politique de l’entreprise, cette solution peut poser un problème de confidentialité des données des développeurs ou de sécurité des livrables. Il est à noter par exemple que npm ne déclare pas protéger les données utilisateur selon la certification Privacy Shield de l’UE.

Avec les autres solutions envisagées, les registres npm sont hébergés et maintenus par l’entreprise.
npm propose aussi npm Enterprise. Le prix est de 16 euros par mois et par utilisateur.
La solution peut s’intégrer à une plateforme SSO et à un outil d’intégration continue. Le prix nous a découragé d’étudier plus longtemps cette solution.
Nous avons cherché une solution gratuite permettant de faire un poc et de commencer rapidement.

Sinopia est une solution gratuite permettant d’héberger un registre npm privé qui cache les librairies de registry.npmjs.org
L’avantage est qu’elle n’oblige pas à installer sa propre base CouchDB pour répliquer le contenu de registry.npmjs.org

Finalement, je me suis orienté vers Nexus car un serveur Nexus se mettait en place pour servir de dépôt maven.
Nexus Repository OSS est gratuit et peut aussi servir de registre npm.
Nous utilisons la version 3.2

La configuration d’un registre npm dans Nexus est très simple et bien documentée ici.

J’ai configuré les registres npm de façon similaire à des dépôts maven : un proxy vers le registre externe registry.npmjs.org, un registre interne pour déployer les librairies privées, et un registre groupant les deux précédents, pour récupérer toutes les dépendances publiques ou privées d’un projet.
Il peut être intéressant de redéployer une librairie avec le même nom et le même numéro de version, notamment en phase de développement. Ce n’est pas possible par défaut sur des librairies npm, l’usage étant de changer de version à chaque déploiement. Nexus permet de surcharger une librairie avec le même nom et la même version : en configurant le registre, il faut sélectionner l’option Allow redeploy dans la liste Deployment policy.

A noter que si le serveur Nexus est couplé avec un Apache HTTP, une configuration d’Apache est nécessaire pour pouvoir publier les librairies. Ce point est la seule coquille qui m’a fait perdre un peu de temps. Ce n’est pas documenté à l’heure actuelle, sauf dans un jira Nexus… https://issues.sonatype.org/browse/NEXUS-11630

Une fois le serveur Nexus en place, le déploiement de librairies privées est standard :
– npm adduser pour configurer l’utilisateur, celui-ci ayant été créé préalablement sur Nexus
– npm config set registry pour changer le registre par défaut registry.npmjs.org et utiliser son registre Nexus
– npm publish pour publier la librairie

Et on peut utiliser la librairie comme dépendance dans n’importe quel projet Angular, en la déclarant dans package.json
J’ai travaillé avec des DevOps qui ne connaissaient pas bien les techno front avant de commencer, ayant plus l’habitude de faire de l’intégration continue pour des projets back. Finalement, le déploiement de librairies privées npm s’est avéré rapide à configurer.

admin

Written by

The author didnt add any Information to his profile yet

  • Julien Poyard

    J’ai déjà utilisé par le passé la solution avec Nexus, c’est bien qu’elle se soit améliorée. Merci pour ce petit article.

  • Jael Gama

    Sujet intéressant, merci pour le partage ;)