web-dev-qa-db-fra.com

Quelle est la différence entre npm-shrinkwrap.json et package-lock.json?

Avec le version de npm @ 5 , il va maintenant écrire un package-lock.json sauf si un npm-shrinkwrap.json existe déjà.

J'ai installé npm @ 5 globalement via:

npm install npm@5 -g

Et maintenant, si un npm-shrinkwrap.json est trouvé pendant:

npm install

un avertissement sera imprimé:

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

Donc, ce que je retiens, c'est que je devrais remplacer le film rétractable par le package-lock.json.

Mais pourquoi existe-t-il un nouveau format pour cela? Que peut le package-lock.json que le npm-shrinkwrap.json ne puisse pas?

127
k0pernikus

Les fichiers ont exactement le même contenu, mais il existe quelques différences dans la façon dont npm les traite, décrites sur le site de documentation et également dans n fichier de documentation du référentiel npm qui commence par adressant explicitement la différence entre ces deux fichiers :

  • package-lock.json n'est jamais publié dans npm, alors que npm-shrinkwrap est par défaut
  • Les fichiers package-lock.json qui ne figurent pas dans le package de niveau supérieur sont ignorés, mais les fichiers shrinkwrap appartenant aux dépendances sont respectés.
  • npm-shrinkwrap.json est rétro-compatible avec les versions 2, 3 et 4 de npm, alors que package-lock.json n'est reconnu que par npm 5+.

Vous pouvez convertir un package-lock.json existant en un npm-shrinkwrap.json en exécutant npm shrinkwrap.

Ainsi:

  • Si vous ne publiez pas votre paquet sur npm, le choix entre ces deux fichiers importe peu. Vous souhaiterez peut-être utiliser package-lock.json parce que c'est la valeur par défaut et que son nom est plus clair pour les débutants de npm; vous pouvez également utiliser npm-shrinkwrap.json pour la compatibilité ascendante avec npm 2-4 s'il vous est difficile de vous assurer que tous les membres de votre équipe de développement sont sur npm 5+. (Notez que npm 5 a été publié le 25 mai 2017; la compatibilité ascendante deviendra de moins en moins importante à mesure que nous avancerons à partir de cette date, car la plupart des utilisateurs finiront par mettre à niveau.)
  • Si vous publiez votre paquet sur npm , vous avez le choix entre:

    1. en utilisant un package-lock.json pour enregistrer exactement les versions de dépendances que vous avez installées, tout en permettant aux personnes installant votre paquet d'utiliser n'importe quelle version des dépendances compatible avec les plages de versions dictées par votre package.json, ou
    2. en utilisant un npm-shrinkwrap.json pour garantir que tous ceux qui installent votre paquet obtiennent exactement la même version de toutes les dépendances


    L’avis officiel décrit (très sommairement) dans la documentation est que l’option 1 devrait être utilisée pour les bibliothèques (probablement afin de réduire le nombre de duplications de paquets provoqué lorsque de nombreuses dépendances d’un paquet dépendent toutes de versions légèrement différentes de même dépendance secondaire), mais cette option 2 pourrait être raisonnable pour les exécutables à installer globalement.

138
Mark Amery

Explication du développeur NPM :

L’idée est certainement que package-lock.json soit la technologie la plus récente et la plus performante, et que npm-shrinkwrap.json soit réservé à ces quelques personnes très précieuses qui s’intéressent beaucoup à ce que leurs bibliothèques possèdent un nœud_module exact - et pour les personnes qui veulent que CI utilise npm @> = 2 pour installer un arbre particulier sans avoir à modifier sa version de npm.

Le nouveau fichier lockfile ("package-lock.json") partage pratiquement le même code, exactement le même format que npm-shrinkwrap (vous pouvez les renommer entre eux!). C'est aussi quelque chose que la communauté semble comprendre: "il a un fichier de verrouillage" semble cliquer beaucoup plus vite avec les gens. Enfin, avoir un nouveau fichier signifiait que nous pouvions avoir une rétrocompatibilité avec un shrinkwrap relativement peu risqué sans avoir à faire des choses bizarres comme permettre-publication mentionnée dans le post parent.

26
SeriousM

Je pense que l'idée était de faire en sorte que la sauvegarde et la réduction se produisent par défaut, mais d'éviter tout problème potentiel lié à la réduction si elle n'était pas souhaitée. Alors, ils lui ont simplement donné un nouveau nom de fichier pour éviter tout conflit. Quelqu'un de npm l'a expliqué plus en détail ici:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

La citation pertinente:

npm publie la plupart des fichiers de votre répertoire source par défaut, et les utilisateurs publient des films rétractables depuis des années. Nous ne voulions pas briser la compatibilité. Avec --save et shrinkwrap par défaut, il y avait un grand risque que cela se produise accidentellement dans le registre et se propage à travers le registre, ce qui rend fondamentalement notre capacité à mettre à jour les dépôts et la déduplication ... null.

Nous avons donc choisi un nouveau nom. Et nous avons soudainement choisi un nouveau nom. Le nouveau fichier lockfile partage pratiquement tout le même code, exactement le même format

12
Cody Brumfield