Vous avez probablement quelque chose comme:
"typescript":"~2.1.6"
dans package.json
lequel npm met à jour la dernière version mineure, dans votre cas,2.4.1
Edit: Question de OP
Mais cela n'explique pas pourquoi "npm install" changerait le fichier de verrouillage. Le fichier de verrouillage n'est-il pas destiné à créer une version reproductible? Si tel est le cas, quelle que soit la valeur semver, il doit toujours utiliser la même version 2.1.6.
Réponse:
Ceci est destiné à verrouiller votre arbre de dépendance complet. Disons qu'il typescript v2.4.1
faut widget ~v1.0.0
. Lorsque vous installez npm, il prend widget v1.0.0
. Plus tard, votre collègue développeur (ou build CI) fait une installation npm et obtient typescript v2.4.1
mais widget
a été mis à jour vers widget v1.0.1
. Maintenant, votre module de nœud n'est pas synchronisé. C'est ce qui package-lock.json
empêche.
Ou plus généralement:
Par exemple, considérez
paquet A:
{"nom": "A", "version": "0.1.0", "dépendances": {"B": "<0.1.0"}}
paquet B:
{"nom": "B", "version": "0.0.1", "dépendances": {"C": "<0.1.0"}}
et package C:
{"nom": "C", "version": "0.0.1"}
S'il s'agit des seules versions de A, B et C disponibles dans le registre, une installation npm normale A s'installera:
A@0.1.0 - B@0.0.1 - C@0.0.1
Cependant, si B@0.0.2 est publié, une nouvelle installation npm A s'installera:
A@0.1.0 - B@0.0.2 - C@0.0.1 en supposant que la nouvelle version n'a pas modifié les dépendances de B. Bien sûr, la nouvelle version de B pourrait inclure une nouvelle version de C et un certain nombre de nouvelles dépendances. Si de tels changements ne sont pas souhaitables, l'auteur de A pourrait spécifier une dépendance à B@0.0.1. Cependant, si l'auteur de A et l'auteur de B ne sont pas la même personne, il n'y a aucun moyen pour l'auteur de A de dire qu'il ne veut pas insérer de nouvelles versions publiées de C lorsque B n'a pas changé du tout.
OP Question 2: Alors laissez-moi voir si je comprends bien. Ce que vous dites, c'est que le fichier de verrouillage spécifie les versions des dépendances secondaires, mais repose toujours sur la correspondance floue de package.json pour déterminer les dépendances de niveau supérieur. Est-ce exact?
Réponse: Non. Package-lock verrouille la totalité de l'arborescence des packages, y compris les packages racine décrits dans package.json
. Si typescript
est verrouillé 2.4.1
dans votre package-lock.json
, il doit le rester jusqu'à ce qu'il soit modifié. Et disons que la typescript
version de demain sortira 2.4.2
. Si je vérifie votre branche et que je cours npm install
, npm respectera le fichier de verrouillage et installera 2.4.1
.
Plus sur package-lock.json
:
package-lock.json est généré automatiquement pour toutes les opérations où npm modifie l'arborescence node_modules ou package.json. Il décrit l'arborescence exacte qui a été générée, de sorte que les installations suivantes peuvent générer des arborescences identiques, indépendamment des mises à jour de dépendance intermédiaires.
Ce fichier est destiné à être validé dans les référentiels sources et sert à diverses fins:
Décrivez une représentation unique d'une arborescence de dépendances telle que les coéquipiers, les déploiements et l'intégration continue sont garantis pour installer exactement les mêmes dépendances.
Fournir aux utilisateurs la possibilité de "voyager dans le temps" vers les états précédents de node_modules sans avoir à valider le répertoire lui-même.
Pour faciliter une meilleure visibilité des changements d'arbre grâce à des différences de contrôle de source lisibles.
Et optimisez le processus d'installation en permettant à npm d'ignorer les résolutions de métadonnées répétées pour les packages précédemment installés.
https://docs.npmjs.com/files/package-lock.json