Gestionnaire de paquets npm
Introduction
L’intérêt de la plate-forme Node est sa grande modularité. Mais justement, comment créer, diffuser, installer et rechercher des modules facilement ? C’est là qu’entre en jeu le gestionnaire de paquets de Node : npm. Il est automatiquement installé avec Node et est donc utilisable sans intervention supplémentaire.
Ce chapitre va donc permettre de comprendre d’abord ce qu’est un paquet, pour ensuite être en mesure de travailler avec. L’objectif est double : vous donner tous les outils pour bien utiliser des paquets qui correspondent à vos besoins, mais aussi être en mesure de créer les vôtres ! Vous trouverez de surcroît une explication sur les normes de versionnage pour être en conformité avec les bonnes pratiques.
1. Qu’est-ce qu’un paquet ?
Il est important de saisir la différence entre un module et un paquet.
Concrètement, un paquet est un dossier contenant des ressources décrites par un fichier package.json. De fait, la plupart des paquets sont des modules, puisque ce sont des bibliothèques qu’il est possible de charger avec la fonction require(). Mais ce n’est pas une obligation : certains paquets contiennent seulement des exécutables.
Pour plus d’informations sur les modules, voir le chapitre Concepts.
2. Exemple d’installation
Illustrons la simplicité...
Recherche du bon paquet
Rien que sur le registre standard npmjs.org, il existe plusieurs dizaines de milliers de paquets. Heureusement, des outils permettent de rechercher ceux qui répondent le mieux à un problème donné et des critères de confiance permettent de départager les différents candidats.
Certains développeurs tiennent à jour des listes de paquets intéressants. Une des plus connues est https://github.com/sindresorhus/awesome-nodejs.
1. Recherche en ligne de commande
La première approche, toujours disponible mais aussi la plus rudimentaire, est d’utiliser la commande npm search <terme>... En voici un exemple :
$ npm search check password hash
NAME DESCRIPTION
AUTHOR DATE VERSION KEYWORDS
hashy Create, check and update password hashes.
=julien-f 2014-10-07 0.4.1 password hash
node-pbkdf2 Wrapper around pbkdf2 to securely and hash and
check... =louischatriot 2013-05-15 0.1.1 password secure
openldap_ssha node versions of openldap compatible ssha password...
=jmarca 2013-12-04 0.0.4
2. Recherche sur npmjs.org
Le site web du registre propose un système de recherche plus utile que la ligne de commande, notamment par son système...
Versionnage
Le versionnage est au cœur du fonctionnement de npm, d’où l’importance de comprendre son principe général. Il est d’ailleurs une bonne pratique dans le monde du développement.
1. Numéro de version
Un paquet peut exister en plusieurs versions (0.2.2 et 0.2.3 par exemple). Chaque version correspond à l’état du paquet à un instant donné.
Pour assurer un suivi des versions cohérent, npm utilise la convention de versionnage sémantique, dont les détails sont disponibles sur http://semver.org/.
Un nom de version se découpe donc ainsi : <majeur>.<ineur>.<patch>.
Tout d’abord, le numéro <patch> est incrémenté quand le paquet reçoit des correctifs, c’est-à-dire des changements mineurs qui n’impactent pas les utilisateurs du paquet en dehors de la correction d’un problème.
Puis, le numéro <mineur> est incrémenté quand le paquet reçoit une nouvelle fonctionnalité mais sans impact sur les fonctionnalités précédentes (elles n’ont donc pas été modifiées).
Enfin, le numéro <majeur> est à son tour incrémenté quand le paquet est modifié en cassant la compatibilité. Cette cassure s’identifie dans l’utilisation du paquet, qui diffère...
Gestion des dépendances
Dès qu’un paquet est utilisé dans un projet, il devient une dépendance. Il est alors nécessaire de la déclarer afin de permettre au programme d’être installé correctement ailleurs que sur le poste courant.
Pour enregistrer les dépendances, il est nécessaire de convertir le projet en paquet (qu’il n’est bien entendu pas obligatoire de publier), c’est-à-dire de créer un fichier package.json.
Cette étape, qui pourrait être fastidieuse, est avantageusement automatisée par la commande npm init qui demande à l’utilisateur de renseigner un certain nombre d’informations :
$ npm init
name: (mon-projet)
version: (0.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /home/julien-f/dev/mon-projet/package.json:
{
"name": "mon-projet",
"version": "0.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"bluebird": "ˆ2.0.1"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author":...
Publication d’un paquet
Dans l’optique de la modularité de Node, il peut être intéressant de publier ses propres paquets sur le registre npmjs.org. Ainsi, il sera possible de déployer facilement le projet partout. De plus, les paquets pourront être réutilisés pour d’autres projets très facilement, par leur concepteur ou par d’autres utilisateurs.
C’est grâce à cet esprit que le registre est si vaste aujourd’hui et compte assez de paquets pour couvrir énormément de besoins.
À l’heure où nous écrivons ces lignes, le projet npm est en train de débuter son modèle commercial, avec un abonnement pour disposer de dépôts privés. De cette façon, il sera possible de publier des paquets en toute confidentialité pour des projets sensibles.
Voici le processus de publication, de la création de comptes jusqu’à la diffusion de paquets.
1. Création d’un compte sur le registre
S’il est possible de consommer de manière anonyme des paquets sur npmjs.org, il devient nécessaire de s’enregistrer pour les publier. Deux options sont envisageables : s’enregistrer directement via la commande npm, ou passer par le site web (http://npmjs.org/). La première solution est la plus triviale :
$ npm adduser
Username: johndoe
Password:...
Gestion d’un paquet publié
Une fois la publication effectuée, la vie du paquet est loin d’être terminée. Il va évoluer : mise à jour, modification des mainteneurs, etc.
1. Mise à jour
Comme tous les paquets, le paquet peut être mis à jour. Dans ce cas, il est nécessaire de modifier son numéro de version, présent dans le fichier package.json. Cependant, plutôt que de le réviser manuellement, il est conseillé d’utiliser la commande adaptée :
$ npm version 0.1.2
Mais il existe encore une façon de faire plus puissante : la commande version peut prendre en paramètre le numéro de version pour l’incrémenter de manière automatique. Dans ce cas, il n’est plus nécessaire de se rappeler de la version courante, et cela limite fortement les erreurs humaines dans le processus de mise à jour.
Par exemple, si un paquet est en 0.1.2, la commande suivante le passe automatiquement en 0.1.3 :
$ npm version patch
Pour passer une version 0.1.2 en 0.2.0 :
$ npm version minor
Et pour passer une version 0.1.2 en 1.0.0 :
$ npm version major
Si le paquet est dans un dépôt git, npm enregistre en plus le changement et l’étiquette (tag) avec le numéro de version. Le duo npm/git est très utilisé : le processus du projet s’en trouve ainsi simplifié.