À 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 28/02/2025

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

Installer depuis le cache

NPM

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, cette commande 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.

$> npm ci

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 !

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

PNPM

C'est la même chose avec PNPM, qui possède la même option que Yarn :

$> pnpm i --frozen-lockfile

Pankaj Patel sur Unsplash

Vous avez terminé l'article ?

Commentaires (0)

pour laisser un commentaire

Aucun commentaire pour l'instant