ELEPHANT technologies, l’ESN locale et à taille humaine spécialisée sur 2 métiers : le développement et le pilotage autour de 4 expertises : hardware, embarqué, software et web.

 

Et aujourd'hui retrouvez Antoine notre développeur fullstack (java, angular) qui nous parle des commandes npm et des fichiers de dépendances. 

 

Let’s go !

 

 

➜ Dès lors que l’on parle de javascript, le gestionnaire de paquet npm est souvent utilisé tout comme yarn. Deux fichiers sont principaux dans l’utilisation de npm: package.json et package-lock.json. Ce fichier package-lock.json est apparu avec la version 5 de npm. Voyons ensemble son utilité et son lien avec les différentes commandes npm. Pour la suite de cet article, nous utilisons la dernière version de npm, la version 8.

 

 

Les fichiers package

 

Npm utilise deux fichiers: le package.json et le package-lock.json. Le premier fichier est celui qui contient les dépendances du projet et leurs versions à utiliser. Par exemple :

 

{
      // [...]
      "bibliotheque-1":"1.0.0",
      "bibliotheque-2":"~5.2.2",
      "bibliotheque-3:"^3.1.3",
      // [...]
}

 

Dans cette exemple on a trois bibliothèques, lors de l’installation des dépendances:

 

➜ La bibliotheque-1 sera uniquement utilisée dans sa version 1.0.0

➜ La bibliotheque-2 pourra utiliser la version 5.2.2 et toutes les versions patchées de la forme 5.2.* avec * >= 2

➜ La bibliotheque-3 pourra utiliser les versions supérieures ou égales à la 3.1.3 sous la forme 3.*.*

 

Le fichier package-lock.json, lui décrit l’arbre exact des dépendances contenues dans le dossier node_modules. Il permet donc de pouvoir retrouver une application avec les mêmes versions de dépendances et des sous dépendances.

 

 

Les commandes principales d’installation

 

  • npm install

 

La commande npm install est une des commandes principales sur npm, elle permet d’installer les dépendances, elle utilise à la fois le fichier package-lock.json mais aussi le package.json. Elle peut également utiliser des fichiers comme npm-shrinkwrap.json ou même yarn.lock mais je n’en parlerais pas dans cet article.

 

Cette commande va dans un premier temps lire le package-lock.json et vérifier que la version des dépendances satisfait bien les versions qu’il y a dans le package.json. Si lors d’un npm install, une des dépendances du fichier lock ne satisfait plus la version du fichier package.json alors le fichier lock va être mis à jour puis utilisé pour l’installation. Un exemple sera plus parlant :

 

J’ai dans le dépôt npm une bibliothèque biblio-1 qui a la version 1.1.0 pour le moment. Dans mon fichier package.json j’ai

 

{
    "biblio-1":"^1.1.0"
}

 

Le npm install va générer un fichier package-lock.json avec la version 1.1.0.

 

Si quelques temps après une version 1.2.0 est publiée, le npm install va toujours utiliser le fichier lock sans le mettre à jour. En effet, la version 1.1.0 qu’il a, satisfait bien la contrainte qui est dans le fichier package.json (^1.1.0) donc il ne met pas à jour le fichier lock.

 

Par contre, si je change dans mon fichier package.json la contrainte et que je passe de ^1.1.0 à ^1.2.0: le fichier lock sera mis à jour. Lors du lancement de la commande, la lecture de la version dans le fichier lock va voir que la version 1.1.0 (qui est dans le fichier lock) ne satisfait plus la version qui est dans le package.json  et va donc mettre à jour la version dans le fichier lock pour la passer en 1.2.0.

 

 

  • npm update

 

La commande npm update met à jour l’ensemble des dépendances à leurs dernières versions en respectant les contraintes du package.json.

 

Dans l’exemple précédent, à la publication de la nouvelle version de biblio-1 (1.2.0) faire un npm update au lieu d’un npm install en laissant la contrainte ^1.10 aurait forcé le package-lock.json à ce mettre à jour avec la nouvelle version.

 

  • npm ci

Le CI ici est pour Continuous Integration. Cette commande est généralement  utilisée, comme  son nom l’indique, dans les environnements d’intégrations continues. Elle est très similaire à npm install à quelques détails près:

  • Le projet doit convenur un fichier package-lock.json
  • Si une des dépendances du package-lock.json ne respecte pas la contrainte dans le package.json, la commande va jeter une erreur contrairement à la commande npm install qui elle aurait mis à jour le fichier lock 
  • Si un dossier node_modules existe lors de l'exécution de la commande, il sera supprimé avant d'installer les dépendances. 
  • Faut-il commit le fichier package-lock.json?

Une question qui peut se poser quand on ne connaît pas le fonctionnement des différentes commandes mais après cet article vous devriez avoir votre petite idée: Oui.

 

Ajouter ce fichier dans git permet à votre équipe de se baser sur les mêmes versions de dépendances que vous ce qui peut éviter des bug liés à l’usage de différentes versions de bibliothèque. Le fichier lock permet aussi lors de la CI/CD de pouvoir utiliser la commande npm ci qui elle se basera uniquement sur ce fichier, améliorant la vitesse d’installation et permettant d’avoir des dépendances ISO entre les différents environnements.

 

 


🐘 Nous remercions Antoine pour son article et si vous souhaitez en découvrir d'autres c'est par ici : https://www.elephant-technologies.fr/les-actualites?news_category_filter%5Bcategory%5D=

 


Sources: