Réponses:
Comme cela est couvert ailleurs, les fichiers de verrouillage de dépendance, qui sont pris en charge par de nombreux systèmes de gestion de paquets (par exemple: compositeur et bundler ), doivent être validés dans la base de code dans les projets de fin de chaîne - de sorte que chaque individu essayant d'exécuter ce projet fasse donc avec exactement l'ensemble de dépendances testé.
Il est moins clair si les fichiers de verrouillage doivent toujours être validés dans des packages destinés à être inclus dans d'autres projets (où des dépendances plus lâches sont souhaitables). Cependant, Yarn et NPM (comme couvert par @Cyrille) ignorent intelligemment yarn.lock
et package-lock.json
respectivement si nécessaire, ce qui permet de toujours valider ces fichiers de verrouillage.
Vous devez donc toujours valider au moins un des yarn.lock
ou enpackage-lock.json
fonction du gestionnaire de packages que vous utilisez.
À l'heure actuelle, nous avons deux systèmes de gestion de paquets différents, qui installent tous deux le même ensemble de dépendances à partir de package.json
, mais qui génèrent et lisent à partir de deux fichiers de verrouillage différents. NPM 5 génère package-lock.json
, tandis que Yarn génère yarn.lock
.
Si vous vous engagez, package-lock.json
vous créez un support pour les personnes installant vos dépendances avec NPM 5. Si vous vous engagez yarn.lock
, vous construisez un support pour les personnes installant des dépendances avec Yarn.
Que vous choisissiez de vous engager yarn.lock
ou package-lock.json
ou les deux dépend du fait que ceux qui développent votre projet utilisent uniquement Yarn ou NPM 5 ou les deux. Si votre projet est open-source, la chose la plus conviviale à faire pour la communauté serait probablement de valider les deux et d'avoir un processus automatisé pour garantir yarn.lock
et package-lock.json
toujours rester synchronisé.
Mise à jour: Yarn a maintenant introduit une import
commande qui générera un yarn.lock
fichier à partir d'un package-lock.json
fichier. Cela peut être utile pour synchroniser les deux fichiers. (Merci @weakish)
Ces questions ont été longuement discutées sur le projet Yarn dans:
Les deux sont maintenant fermés.
yarn import
a été introduit en 2018. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
Vous devez valider 1 fichier de verrouillage d'arborescence de dépendances, mais vous ne devez pas valider les deux. Cela nécessite également une standardisation sur yarn ou npm (pas les deux) pour construire + développer un projet avec.
Si vous validez à la fois le yarn.lock
fichier ET les package-lock.json
fichiers, il existe de nombreuses façons dont les 2 fichiers peuvent fournir des arbres de dépendances différents (même si les algorithmes de résolution d'arborescence de yarn et de npm sont identiques), et il n'est pas trivial de s'assurer qu'ils fournissent exactement le même réponse. Comme ce n'est pas trivial, il est peu probable que la même arborescence de dépendances soit maintenue dans les deux fichiers, et vous ne voulez pas de comportement différent selon que la construction a été faite en utilisant yarn ou npm.
Si et quand yarn passe de l'utilisation yarn.lock
à package-lock.json
( problème ici ), alors le choix du fichier de verrouillage à valider devient facile, et nous n'avons plus à nous soucier de yarn et npm résultant en des constructions différentes. Sur la base de cet article de blog , il s'agit d'un changement auquel nous ne devrions pas nous attendre bientôt (l'article de blog décrit également les différences entre yarn.lock
et package-lock.json
.
Je pensais à la même question. Voici mes pensées, j'espère que cela vous aidera:
La documentation de npm package-lock.json dit ce qui suit:
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 puissent générer des arborescences identiques, quelles que soient les mises à jour de dépendances intermédiaires.
C'est génial car cela empêche l'effet "fonctionne sur ma machine".
Sans ce fichier, si vous npm install --save A
, npm s'ajoutera "A": "^1.2.3"
à votre package.json
. Lorsque quelqu'un d'autre exécute npm install
votre projet, il est possible que la version 1.2.4
de A
ait été publiée. Comme il s'agit de la dernière version disponible qui satisfait la plage de semver spécifiée dans votre package.json
, il installera cette version. Mais que se passe-t-il s'il y a un nouveau bogue introduit dans cette version? Cette personne aura un problème que vous ne pouvez pas reproduire car vous avez la version précédente, sans aucun bug.
En corrigeant l'état de votre node_modules
répertoire, package-lock.json
file évite ce problème car tout le monde aura les mêmes versions de tous les packages.
Mais que se passe-t-il si vous écrivez et publiez un module npm? La documentation dit ce qui suit:
Un détail clé à propos de package-lock.json est qu'il ne peut pas être publié, et il sera ignoré s'il se trouve à un endroit autre que le package de niveau supérieur.
Ainsi, même si vous le validez, lorsque l'utilisateur installe votre module, il n'obtiendra pas le package-lock.json
fichier, mais uniquement le package.json
fichier. Ainsi, npm installera la dernière version qui satisfait les plages semver de toutes vos dépendances. Cela signifie que vous souhaitez toujours tester votre module avec ces versions de vos dépendances, et non celle que vous avez installée lorsque vous avez commencé à écrire votre module. Donc, dans ce cas, package-lock.json
est clairement inutile. De plus, cela peut être ennuyeux.
Voici ma règle de base: si vous travaillez sur une application, validez le ou les fichiers de verrouillage. Si vous gérez une bibliothèque, ajoutez-la à votre liste ignorée. Dans tous les cas, vous devriez utiliser des plages de semver précises dans package.json
. Yehuda Katz ( mis en cache ) a écrit une excellente explication pour savoir quand commettre Gemfile.lock
(fichier de verrouillage de Ruby) et quand ne pas le faire. Au moins, lisez la section tl; dr.
.gitignore
et se trouve généralement à la racine du projet.
Vous avez raison! Autoriser les deux npm
et yarn
être utilisé va causer des problèmes. Jetez un œil à cet article .
Actuellement, nous prévoyons d'ajouter des avertissements aux utilisateurs qui utilisent à la fois
yarn
etnpm
dans le même référentiel pour installer des packages.Nous vous recommandons vivement de supprimer le
package-lock.json
fichier si vous décidez d'utiliser du fil afin d'éviter toute confusion future et d'éventuels problèmes de cohérence.
Vous pouvez ne pas vouloir à la fois npm
et en yarn
tant que gestionnaire de paquets.
Ces fichiers sont gérés par vos outils, donc - en supposant que l'utilisation de yarn mettra effectivement à jour le package-lock.json
- je suppose que la validation des deux fichiers fonctionne correctement.
Je pense que le plus important pour votre utilisateur est package-lock.json
(par exemple, je n'utilise pas de fil), donc celui-ci doit être validé.
Pour le yarn.lock
, cela dépend si vous travaillez seul ou en équipe. En solo, alors je suppose qu'il n'est pas nécessaire de le valider. Si vous (prévoyez de) travailler en équipe, vous devriez probablement le valider, au moins jusqu'à ce que le fil le soutienne 🙂
Je suppose que l'équipe de fil finira par cesser d'utiliser yarn.lock
et utiliser à la package-json.lock
place, à ce moment-là, cela deviendra plus simple 😛
Non, l'utilisation simultanée des deux fichiers de verrouillage entraînera le plus souvent des incohérences dans votre arborescence de dépendances, en particulier lors de la collaboration au sein d'une équipe. Ignorer un verrou ou l'autre est une solution simple. Assurez-vous simplement que votre équipe comprend et accepte ce changement.