Dois-je valider les fichiers yarn.lock et package-lock.json?

119

Nous utilisons du fil pour toutes nos installations déterministes de pkg mais n'empêchons pas l'utilisateur d'utiliser npm - je suppose que le fait d'avoir ces deux fichiers causera des problèmes. Doit-on en ajouter un à votre répertoire .gitignore?

Artimus
la source
2
Double-
Aurora0001

Réponses:

149

Toujours valider les fichiers de verrouillage de dépendance en général

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.locket package-lock.jsonrespectivement si nécessaire, ce qui permet de toujours valider ces fichiers de verrouillage.

Vous devez donc toujours valider au moins un des yarn.lockou enpackage-lock.json fonction du gestionnaire de packages que vous utilisez.

Devez-vous valider à la fois yarn.lock et package-lock.json?

À 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.jsonvous 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.lockou package-lock.jsonou 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.locket package-lock.jsontoujours rester synchronisé.

Mise à jour: Yarn a maintenant introduit une importcommande qui générera un yarn.lockfichier à partir d'un package-lock.jsonfichier. 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.

Robin Winslow
la source
1
Très bonne réponse. Cependant, en ce qui concerne votre point: "La chose la plus sûre à faire serait de les générer et de les valider à chaque fois que vos dépendances changent." Je ne sais pas pourquoi ce serait la chose la plus «sûre» à faire. Comme vous l'avez mentionné, il est très probable que «les deux fichiers ne soient pas synchronisés». La réponse de @ crimbo explique ce problème plus en détail.
TachyonVortex
Je pense que cela pourrait être une différence pour savoir si vous contrôlez toutes les personnes qui gèrent votre projet. Si vous possédez l'équipe, bien sûr, standardisez sur Yarn et utilisez yarn.lock. Mais s'il s'agit d'un projet open source (comme tous les nôtres), il se peut que les gens utilisent NPM sur vos projets, même si vous utilisez Yarn en interne. Donc, la chose la plus sûre idéale à faire serait d'utiliser un système automatisé pour garantir que yarn.lock et package-lock.json resteraient synchronisés. Et faites également pression sur Yarn pour qu'il passe à package-lock.json.
Robin Winslow
1
yarn importa été introduit en 2018. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
faible
18

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.

Voici l'article sur le fil expliquant pourquoi yarn.lock doit être engagé, si vous standardisez sur le fil.

Si vous validez à la fois le yarn.lockfichier ET les package-lock.jsonfichiers, 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.locket package-lock.json.

crimbo
la source
11

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 installvotre projet, il est possible que la version 1.2.4de Aait é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_modulesrépertoire, package-lock.jsonfile é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.jsonfichier, mais uniquement le package.jsonfichier. 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.jsonest clairement inutile. De plus, cela peut être ennuyeux.

Cyrille
la source
7

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.

ravinggenius
la source
Le lien est rompu.
Juha Syrjälä
Merci @ JuhaSyrjälä. J'ai ajouté un deuxième lien vers l'article.
ravinggenius
Où se trouve la liste des ignorés pour npm ou yarn?
neves
"ignore list" sera spécifique au référentiel source de votre projet (git, mercurial, Subversion). Dans le cas de git, le fichier est appelé .gitignoreet se trouve généralement à la racine du projet.
ravinggenius
4

Vous avez raison! Autoriser les deux npmet 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 et npmdans le même référentiel pour installer des packages.

Nous vous recommandons vivement de supprimer le package-lock.jsonfichier 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 npmet en yarntant que gestionnaire de paquets.

BinaryJoe01
la source
2

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.locket utiliser à la package-json.lockplace, à ce moment-là, cela deviendra plus simple 😛

Dohzya
la source
1
Ils n'ont pas arrêté d'utiliser yarn.lock.
jayarjo
0

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.

AndrewSteinheiser
la source