Pourquoi ne “npm install” réécrire paquet-lock.json?
J'ai récemment mis à niveau vers mnp@5. J'ai maintenant un paquet de verrouillage.fichier json avec tout de package.json. Je m'attends à ce que, quand je lance npm install
que la dépendance versions devrait être tiré à partir 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 se termine effectivement en place de la modification et de la réécriture de mon colis-lock.fichier json.
Par exemple, le fichier de verrouillage a tapuscrit spécifié pour être à la version 2.1.6. Puis, après la npm install
de commande, la version a été modifiée pour 2.4.1. Qui semble à l'encontre de l'objectif d'un fichier de verrouillage.
Ce qui me manque? Comment puis-je obtenir mnp à fait respecter mon fichier de verrouillage?
- Ce n'est pas la réponse à votre question donc j'espère qu'un commentaire est ok, mais avoir un regard sur le Fil. La commutation a pris moins d'une heure pour nous.
- Le même problème mais à l'aide de fils de github.com/yarnpkg/yarn/issues/570 (très instructif)
- Je vais avoir le même problème. Mon
package-lock.json
est regénérée quand je lancenpm install
. Ce sent comme un mnp bug. Utilisez-vous votre propre registre? - Voir aussi npm5 équivalent au fil de l'-pur-lockfile drapeau?
--no-save
empêche de changer le fichier de verrouillage, mais cela n'affecte pas la dingo de premier niveau de dépendance de la mise à niveau de l'OP cite.- Pourquoi voudriez-vous attendre à quelque chose appelé paquet de verrouillage pour verrouiller les paquets? Paquet de verrouillage est analogue à la façon, lorsque vous mettez n'importe quel clé dans une serrure de porte, la serrure transforme lui-même pour correspondre quelle que soit la clé a été mis en place, puis ouvre la porte. Maintenant, si vous m'excuserez, je suis en retard pour une partie de thé avec un lapin.
- Ce qui semble se produire avec les npm6 - j'ai couru
npm i
sans rien changer, et monpackage-lock.json
a été modifié (les versions sous tous les paquets dansrequires
changé). Il semble que prévu et de ne pas casser quoi que ce soit? Plus d'infos ici - Depuis les versions modifiées, ce qui devrait être reflété dans le paquet-lock ainsi
Vous devez vous connecter pour publier un commentaire.
Mise à jour 3: Comme d'autres réponses souligner ainsi, la
npm ci
commande était introduit dans mnp 5.7.0 comme moyen supplémentaire d'atteindre rapidement et de façon reproductible construit dans l'IC contexte. Voir la la documentation et npm blog pour de plus amples informations.Mise à jour 2: La question de la mise à jour et de clarifier la documentation est GitHub question n ° 18103.
Mise à jour 1: Le comportement qui a été décrit ci-dessous suis fixé dans mnp 5.4.2: actuellement prévue le comportement est décrit dans GitHub question n ° 17979.
Réponse originale à cette question: Le comportement de
package-lock.json
a été changé dans npm 5.1.0 tel que discuté dans question n ° 16866. Le comportement que vous observez, c'est apparemment prévu par npm à partir de la version 5.1.0.Qui signifie que
package.json
pouvez remplacerpackage-lock.json
chaque fois qu'une nouvelle version est disponible pour une dépendance danspackage.json
. Si vous souhaitez épingler vos dépendances de manière efficace, vous devez maintenant spécifier les versions sans préfixe, par exemple, vous avez besoin d'écrire comme1.2.0
au lieu de~1.2.0
ou^1.2.0
. Ensuite, la combinaison depackage.json
etpackage-lock.json
donnera reproductible construit. Pour être clair:package-lock.json
seul ne verrouille plus le niveau de la racine des dépendances!Si cette décision a été bonne ou pas, c'est défendable, il y a une discussion en cours résultant de cette confusion sur GitHub dans question n ° 17979. (Dans mes yeux c'est une décision incertaine; au moins le nom
lock
n'est pas plus valable.)Encore une note de côté: il y a aussi une restriction pour les registres qui ne supportent pas immuable paquets, comme lorsque vous tirez sur les paquets directement à partir de GitHub au lieu de npmjs.org. Voir cette documentation du package de serrures pour de plus amples explications.
package.json
doit aussi être verrouillé.npm update
pour ensuite ? 😮 j'ai eu le même sentiment quenpm install
mis à jour deps, mais je ne veux pas le croire.. mais semble comme c'est malheureusement vrai.. de toute façon il y a toujours l'option d'utilisernpm shrinkwrap
pour verrouiller deps, mais certainement nom du package-lock est incorrect car il ne craint pas le gel, ni de verrouillage dépendances..yarn.lock
ne semble pas souffrir du même problème que lepackage-lock.json
. Je voudrais l'utiliser sur la ngp, si possible.npm install
ne prend plus le nouveau package disponibles, si la "verrouillé" version est compatible avec ce package.json précise.J'ai trouvé qu'il y aura une nouvelle version de la ngp 5.7.1 avec la nouvelle commande
npm ci
, qui s'installent à partirpackage-lock.json
seulementnpm ci || npm i
npm install
" avant de lancer la commandenpm ci
dans ce projet. Ne pasnpm install
remplacer le package-lock.fichier json?npm
que modifie le fichier de verrouillage si nécessaire, pour répondre à la spécification dans les packages.json. Donc, si des paquets utilisés à-direthatpackage: 1
, et de verrouiller dit..: 1.0.4
, dev pouvez modifier à-direthatpackage: 2
- et qui sera force de verrouiller le fichier pour changer, parce que1.0.4
n'est pas compatible avec la nouvelle gamme spécifiée. Si ce n'est pas le changementpackages.json
, reste bloqué à la version exacte, jusqu'à supprimer le fichier de verrouillage. [Si ne pas rester enfermé, et ne pas modifier les paquets.json, remplir un rapport de bogue.]Utiliser le nouvellement introduit
L'introduction de
npm ci
pour être plus rapide, plus fiable construitnpm ci
, et de n'utilisernpm install
si la mise à jour ou l'installation de nouveaux paquets.node_modules
répertoire et reconstruit localement, même si c'est un vide, mais important lien symbolique. 🙁Réponse Courte:
npm install
honneurs paquet-lock.json seulement si il satisfait aux exigences du paquet.json.npm ci
.Ici est un scénario qui pourrait expliquer les choses (Vérifié avec NPM 6.3.0)
Vous déclarer une dépendance dans le paquet.json comme:
Alors que vous faites,
npm install
qui va générer un paquet de verrouillage.json avec:Quelques jours plus tard, une nouvelle version mineure de "depA" est sorti, dire "1.1.0", puis le suivant est vrai:
Ensuite, vous mettez à jour manuellement votre colis.json à:
Puis exécutez à nouveau:
npm-shrinkwrap.json
qui est exactement le même dans la syntaxe et le contenu quepackage-lock.json
et entend la même fonctionnalité.npm install
va utiliser le verrouillage de versions depackage-lock.json
à moins qu'il ne remplit pas lespackage.json
auquel cas il s'installe package.json et à la reconstruction du paquet-lock.json en conséquence. Si vous avez changé votrepackage.json
de telle manière que le package existant-lock répond toujours à la mise à jourpackage.json
il va continuer à utiliser quepackage-lock
npm install
ne fait rien, quel que soit-de-paquet de verrouillage.json. Nous avons explicitement les packages de mise à jour, même quand il y a des mises à jour disponibles qui correspondent à la semver spécifié dans le paquet.json. Au moins cela a été mon expérience depuis des années.Utiliser le
npm ci
de commande au lieu denpm install
."ci" signifie "intégration continue".
Il va installer les dépendances d'un projet basé sur l'emballage-lock.fichier json au lieu de clément paquet.fichier json dépendances.
Il permettra de réaliser des construit à vos coéquipiers et il est également beaucoup plus rapide.
Vous pouvez en lire plus à ce sujet dans ce post de blog:
https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
ci
se réfère à une "intégration continue", comme indiqué dans les docs et post de blog annonçant la commande: blog.npmjs.org/post/171556855892/...Il apparaît que ce problème est résolu dans mnp v5.4.2
https://github.com/npm/npm/issues/17979
(Défiler vers le bas pour le dernier commentaire dans le fil)
Mise à jour
Corrigés dans 5.6.0. Il y avait une croix-plate-forme de bug dans 5.4.2 qui a été à l'origine du problème à toujours se produire.
https://github.com/npm/npm/issues/18712
Mise à jour 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.npm i
. Par exemple, le modulefsevents
est enlevé quand j'npm i
sur une machine qui ne prend pas en chargefsevents
et puis le module est ajouté lorsque l'onnpm i
de nouveau sur une machine qui n'.fsevents
baisse dans monpackage-lock.json
avec[email protected]
, tout en collaborant avec Mac OS X contributeurs. Si vous n'avez pas ouvert de problème, je le ferai.Dans l'avenir, vous serez en mesure d'utiliser un
--from-lock-file
(ou similaire) drapeau pour installer seulement de lapackage-lock.json
sans le modifier.Cela sera utile pour l'IC, etc. les environnements où reproductible versions sont importantes.
Voir https://github.com/npm/npm/issues/18286 pour le suivi de la fonctionnalité.
npm ci
qui gère aussi votre question.Vous avez probablement quelque chose comme:
dans votre
package.json
qui mnp mises à jour à la dernière version mineure, dans votre cas, étant2.4.1
Plus sur
package-lock.json
:paquet-lock.json est généré automatiquement pour toutes les opérations où mnp modifie soit le node_modules arbre, ou un package.json. Il décrit exactement l'arbre qui les a produits, tels que par la suite, installe sont en mesure de générer des arbres identiques, quel que soit intermédiaire de la dépendance des mises à jour.
Ce fichier est destiné à être engagé dans la source de dépôts, et qui sert à des fins diverses:
https://docs.npmjs.com/files/package-lock.json
$npm update -g npm
package-lock.json
tire vers le bas et puis nous couronsnpm install
, mais lepackage-lock.json
fichier est modifié et que nous avons à faire à une réinitialisation de l'avant, nous pouvons tirer les prochains changements.npm i
?~2.1.6
danspackage.json
, mnp ignore encore aujourd'hui tout ce qui était de sortie dans le fichier de verrouillage.Il y a un sujet ouvert à cet effet sur leur github page: https://github.com/npm/npm/issues/18712
Ce problème est plus grave quand les développeurs sont à l'aide de différents systèmes d'exploitation.
EDIT: le nom de "lock" est une question délicate, son MNP essaie de rattraper le Fil. Ce n'est pas un fichier verrouillé que ce soit.
package.json
est un utilisateur de fichier fixe, qui une fois "installé" va générer dossier node_modules arbre et l'arbre sera ensuite écrite danspackage-lock.json
. Donc, vous voyez, c'est l'autre manière autour de dépendance de versions sera tiré à partir depackage.json
comme toujours, etpackage-lock.json
doit être appelépackage-tree.json
(espérons que cela fait ma réponse plus claire, après tant de downvotes)
Une solution simpliste:
package.json
avoir vos dépendances comme d'habitude, alors quepackage-lock.json
est "exact, et surtout reproductible node_modules tree" (arbre de prise de npm docs lui-même).Comme pour la délicate nom, son MNP essaie de rattraper le Fil.