Je viens récemment de passer à npm @ 5 . J'ai maintenant un fichier package-lock.json avec tout de package.json . Je m'attendrais à ce que, lorsque j'exécute,npm install
les versions de dépendance soient extraites du fichier de verrouillage pour déterminer ce qui devrait être installé dans mon répertoire node_modules . Ce qui est étrange, c'est qu'il finit par modifier et réécrire mon fichier package-lock.json .
Par exemple, le fichier de verrouillage a été spécifié pour être à la version 2.1.6 . Ensuite, après la npm install
commande, la version a été changée en 2.4.1 . Cela semble aller à l'encontre de l'objectif global d'un fichier de verrouillage.
Qu'est-ce que je rate? Comment faire pour que npm respecte réellement mon fichier de verrouillage?
la source
package-lock.json
se régénère quand je coursnpm install
. Cela sent comme un bogue npm. Utilisez-vous votre propre registre?--no-save
empêche la modification du fichier de verrouillage, mais cela n'affecte pas la mise à niveau de dépendance de premier niveau maladroite que l'OP mentionne.Réponses:
Mise à jour 3: Comme le soulignent d'autres réponses, la
npm ci
commande a été introduite dans npm 5.7.0 comme moyen supplémentaire pour obtenir des builds rapides et reproductibles dans le contexte CI. Voir la documentation et le blog npm pour plus d'informations.Mise à jour 2: le problème de mise à jour et de clarification de la documentation est le problème GitHub # 18103 .
Mise à jour 1: le comportement décrit ci-dessous a été corrigé dans npm 5.4.2: le comportement actuellement prévu est décrit dans le problème GitHub n ° 17979 .
Réponse originale: Le comportement de a
package-lock.json
été modifié dans npm 5.1.0 comme indiqué dans le numéro # 16866 . Le comportement que vous observez est apparemment prévu par npm à partir de la version 5.1.0.Cela signifie que cela
package.json
peut remplacerpackage-lock.json
chaque fois qu'une nouvelle version est trouvée pour une dépendance danspackage.json
. Si vous souhaitez épingler efficacement vos dépendances, vous devez maintenant spécifier les versions sans préfixe, par exemple, vous devez les écrire en tant que1.2.0
au lieu de~1.2.0
ou^1.2.0
. Ensuite, la combinaison depackage.json
etpackage-lock.json
produira des versions reproductibles. Pour être clair:package-lock.json
seul ne verrouille plus les dépendances au niveau racine!Que cette décision de conception soit bonne ou non est discutable, il y a une discussion en cours résultant de cette confusion sur GitHub dans le numéro # 17979 . (À mes yeux, c'est une décision discutable; au moins le nom
lock
n'est plus vrai.)Une autre remarque: il existe également une restriction pour les registres qui ne prennent pas en charge les packages immuables, comme lorsque vous extrayez des packages directement depuis GitHub au lieu de npmjs.org. Consultez cette documentation sur les verrous de package pour plus d'explications.
la source
npm update
alors? : o J'ai eu le même sentiment que lesnpm install
deps mis à jour, mais je ne veux pas le croire .. mais il semble que c'est malheureusement vrai .. Quoi qu'il en soit, il y a toujours une option à utilisernpm shrinkwrap
pour verrouiller les deps, mais le nom du package-lock est définitivement incorrect car il ne gèle pas, ni ne bloque les dépendances ..J'ai trouvé qu'il y aura une nouvelle version de NPM 5.7.1 avec la nouvelle commande
npm ci
, qui installera à partir depackage-lock.json
seulementla source
npm install
" avant d'exécuter la commandenpm ci
dans ce projet. Ne pasnpm install
remplacer le fichier package-lock.json?npm
ne modifie le fichier de verrouillage que si nécessaire pour le faire, pour répondre aux spécifications de packages.json . Donc, si les packages avaient l'habitude de direthatpackage: 1
, et lock dit..: 1.0.4
, dev peut modifier pour direthatpackage: 2
- et cela forcera le fichier de verrouillage à changer, car il1.0.4
n'est pas compatible avec la nouvelle plage spécifiée. Si vous ne changez paspackages.json
, la version exacte restera verrouillée jusqu'à la suppression du fichier de verrouillage. [Si ne reste pas verrouillé et n'a pas modifié packages.json, déposez un rapport de bogue.]Utilisez le nouveau
Présentation
npm ci
pour des versions plus rapides et plus fiablesla source
npm ci
, et n'utilisons quenpm install
si la mise à jour ou l'installation de nouveaux packages.node_modules
répertoire existant et reconstruit localement, même s'il s'agit d'un lien symbolique vide mais important. :(npm ci
je pense qu'ils seraient très réticents à introduire tout ce qui pourrait réduire les performances pour un cas d'utilisation assez rare. Vous voudrez peut-être consulter pnpm.js.org qui utilise des liens durs pour réduire l'utilisation du disque.Réponse courte:
npm install
honore package-lock.json uniquement s'il satisfait aux exigences de package.json.npm ci
.Voici un scénario qui pourrait expliquer les choses (vérifié avec NPM 6.3.0)
Vous déclarez une dépendance dans package.json comme:
Ensuite, vous
npm install
générez un package-lock.json avec:Quelques jours plus tard, une nouvelle version mineure de "depA" est publiée, par exemple "1.1.0", puis ce qui suit est vrai:
Ensuite, vous mettez à jour manuellement votre package.json pour:
Relancez ensuite:
la source
npm install
utilisera les versions verrouillées depackage-lock.json
sauf s'il ne satisfait pas lepackage.json
cas auquel il installe package.json et reconstruit package-lock.json en conséquence. Si vous l'avez modifiépackage.json
de telle manière que le verrouillage de package existant satisfait toujours la misepackage.json
à jour, il continuera à l'utiliserpackage-lock
npm install
ne fait rien, indépendamment de package-lock.json. Nous devons mettre à jour explicitement les packages même lorsqu'il existe des mises à jour qui correspondent au semver spécifié dans package.json. C'est du moins mon expérience depuis des années.node_modules
satisfait la plage depackage.json
, et qu'il n'y a pas depackage-lock.json
fichier, npm ne mettra pas à jour le module lors de l'exécutionnpm install
. Je suppose que c'est bien puisque vous pouvez utilisernpm update
(ounpm-check
pour les dernières) pour mettre à jour les dépendances, et ce comportement est plus rapide pour le cas de quelqu'un qui ajoute juste une entrée àpackage.json
, et ne veut pas que les paquets sans rapport se mettent à jour vers la dernière qui satisfait le semi-ver gamme.Utilisez la
npm ci
commande au lieu denpm install
."ci" signifie "intégration continue".
Il installera les dépendances du projet basées sur le fichier package-lock.json au lieu des dépendances du fichier lenient package.json.
Il produira des builds identiques à ceux de vos coéquipiers et il est également beaucoup plus rapide.
Vous pouvez en savoir plus à ce sujet dans cet article de blog: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
la source
ci
fait référence à "l'intégration continue", comme mentionné dans les documents et le blog annonçant la commande: blog.npmjs.org/post/171556855892/…node_modules
dossier et le recréera à partir de zéro. Est-ce vraiment beaucoup plus rapide? Le dossier est- il égalementnpm install
suppriménode_modules
?npm install
doit résoudre toutes les dépendances du package lors de son exécution.npm ci
est juste une liste d'achats de "obtenir ces modules exacts".À l'avenir, vous pourrez utiliser un
--from-lock-file
indicateur (ou similaire) pour installer uniquement à partir dupackage-lock.json
sans le modifier.Cela sera utile pour les environnements CI, etc. où les builds reproductibles sont importants.
Voir https://github.com/npm/npm/issues/18286 pour le suivi de la fonctionnalité.
la source
npm ci
qui traite également votre question.Il semble que ce problème soit résolu dans npm v5.4.2
https://github.com/npm/npm/issues/17979
(Faites défiler jusqu'au dernier commentaire du fil)
Mise à jour
Actuellement corrigé dans 5.6.0. Il y avait un bogue multiplateforme dans 5.4.2 qui provoquait toujours le problème.
https://github.com/npm/npm/issues/18712
Update 2
Voir ma réponse ici: https://stackoverflow.com/a/53680257/1611058
npm ci
est la commande que vous devez utiliser lors de l'installation de projets existants maintenant.la source
npm i
. Par exemple, le modulefsevents
est supprimé lorsque jenpm i
sur une machine qui ne prend pas en chargefsevents
, puis le module est ajouté ànpm i
nouveau lorsque l'on sur une machine qui le fait.fsevents
baisse dans monpackage-lock.json
avec[email protected]
tout en collaborant avec les contributeurs Mac OS X. Si vous n'avez pas ouvert de problème, je le ferai.Vous avez probablement quelque chose comme:
dans
package.json
lequel npm met à jour la dernière version mineure, dans votre cas,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:
https://docs.npmjs.com/files/package-lock.json
la source
package-lock.json
tiré vers le bas puis nous exécutonsnpm install
, mais lepackage-lock.json
fichier est modifié et nous devons effectuer une réinitialisation avant de pouvoir tirer les modifications suivantes.Vous devriez probablement utiliser quelque chose comme ça
Au lieu de l'utiliser
npm install
si vous ne souhaitez pas modifier la version de votre package.Selon la documentation officielle, à la fois
npm install
etnpm ci
installez les dépendances nécessaires au projet.la source
Il y a un problème ouvert pour cela sur leur page github: https://github.com/npm/npm/issues/18712
Ce problème est plus grave lorsque les développeurs utilisent différents systèmes d'exploitation.
la source
EDIT: le nom "lock" est délicat, son NPM essayant de rattraper Yarn. Ce n'est pas un fichier verrouillé.
package.json
est un fichier fixe par l'utilisateur qui, une fois "installé", générera une arborescence de dossiers node_modules et cette arborescence sera alors écritepackage-lock.json
. Donc, vous voyez, c'est l'inverse - les versions de dépendance seront extraitespackage.json
comme d'habitude etpackage-lock.json
devraient être appeléespackage-tree.json
(j'espère que cela a clarifié ma réponse, après tant de votes négatifs)
Une réponse simpliste:
package.json
ayez vos dépendances comme d'habitude, alors quepackage-lock.json
c'est "un arbre node_modules exact et plus reproductible" (tiré des documents npm lui-même ).Quant au nom délicat, son NPM essaie de rattraper Yarn.
la source