À quoi sert le fichier package-lock.json et faut-il le commit ?
Quelle est la fonction de ce fichier et faut-il le versionner ?
Article publié le 04/03/2021, dernière mise à jour le 19/09/2023
Si je devais résumer en quelques mots le rôle du fichier package-lock.json je dirais qu'il sert à stocker une représentation exacte des dépendances installées dans le projet à un instant T.
Mais une autre question se pose alors :
Pourquoi est-ce que nous aurions besoin de connaître l'état exacte des dépendances du projet alors que nous avons déjà le fichier package.json pour ça ?
Simplement parce que le fichier package.json n'indexe pas les paquets installés mais contient simplement des règles pour installer ces derniers selon une indication de version plus ou moins précise.
En utilisant des numéros de version comme "latest", "~1.1.0" ou "^1.1.0", impossible de prévoir quelle sera la version exacte qui sera installée au final.
On dit que l'exécution de la commande npm install est "non-déterministe" car l'exécuter plusieurs fois peut avoir des résultats différents.
Voilà donc un comportement qui peut poser problème lorsque deux développeurs d'une même équipe se retrouvent avec deux dossiers de dépendances différents, pourtant issus du même package.json
Voilà pourquoi depuis la version 5 de NPM sont apparus deux nouvelles fonctionnalités :
- le fichier package-lock.json
- la commande npm ci
package-lock.json
Le fichier package-lock.json liste toutes les dépendances installées, avec pour chacune :
- la version exacte
- l'url depuis laquelle elle a été installé
- un checksum pour vérifier l'intégrité
- les sous-dépendances
Ce qui permet d'avoir une photographie instantanée très précise des dépendances actuellement utilisées par le projet, qui sera mise à jour à chaque opération modifiant le contenu de "node_modules" ou du fichier package.json
npm ci
La commande "npm ci" est l'équivalent de la commande "npm install", mais au lieu d'aller chercher chaque dépendance dans le registre (registry.npmjs.org par exemple), ce dernier va d'abord regarder dans le cache (donc beaucoup plus rapide pour les redéploiement), et il ne sera pas basé sur le fichier package.json, mais bien sur le fichier package-lock.json
En plus de la rapidité d'exécution, "npm ci" permet par exemple de reprendre un état précédent d'une application (même datant de plusieurs mois), et de pouvoir retrouver chaque dépendance dans leur version d'origine, même si de nombreuses versions sont sorties depuis.
Voilà pourquoi le fichier package-lock.json est très utile, et voilà aussi la raison pour laquelle il faut absolument l'ajouter à vos commits vos différents projets !
Avec Yarn
Yarn possède un équivalent, mais cette fois au lieu d'être une commande différente, c'est une option passée lors de l'installation des dépendances : "yarn install --frozen-lockfile".
Aucun commentaire pour l'instant