Voulez-vous demander une _fonctionnalité_ ou signaler un _bug_ ?
_caractéristique_
Quel est le comportement actuel ?
Ne pas passer --pure-lockfile
pour la commande install
me confond car il modifie le fichier de verrouillage lors de l'installation de node_modules.
Nous nous sommes mis d'accord sur la sémantique selon laquelle add/upgrade/remove
doit changer les dépendances et install
est de reconstruire systématiquement les node_modules à partir du fichier de verrouillage.
La cohérence est perdue lorsque le fichier de verrouillage est modifié en fonction de l'environnement (version de fil actuellement installée).
Quel est le comportement attendu ?
N'écrivez pas thread.lock ou package.json lorsque vous faites yarn install
.
Pour mettre à jour laine.lock, utilisez yarn upgrade
Veuillez mentionner votre node.js, votre fil et la version de votre système d'exploitation.
fil 0,14
Je suis d'accord. Il devrait y avoir une discussion sur la raison yarn install
laquelle
Il existe un cas pour yarn install
créer un fichier de verrouillage s'il n'y en a pas, c'est-à-dire lorsque quelqu'un convertit un projet pour utiliser yarn
, mais la raison de toujours l'écrire n'est pas claire. Je suis d'accord avec l'opinion de @bestander selon laquelle seules les actions de mutation devraient mettre à jour le fichier de verrouillage par défaut, c'est- add/upgrade/remove
dire
Devrait-il y avoir un moyen de modifier le fichier de verrouillage sans add/remove/upgrade
ex : dans le scénario où vous mettez à niveau Yarn et qu'il utilise une nouvelle version du fichier de verrouillage ?
Je suppose que l'option pourrait être inversée
yarn install --save-lockfile
Le 17 octobre 2016 à 18h53, James Ide [email protected] a écrit :
Devrait-il y avoir un moyen de modifier le fichier de verrouillage sans ajouter/supprimer/mettre à niveau
ex : dans le scénario où vous mettez à niveau Yarn et qu'il utilise un nouveau fichier de verrouillage
version?-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/yarnpkg/yarn/issues/570#issuecomment -254282256, ou couper le son
le fil
https://github.com/notifications/unsubscribe-auth/ACBdWJLpdvqiwcBwqE4KB3x3f4oCn_nVks5q07YYgaJpZM4KSlSw
.
Je suis également confus par cela. Quelle est la raison du comportement par défaut actuel ?
Afaik, il n'y avait pas de bonnes raisons pour le comportement par défaut.
L'idée, je suppose, est de garder les fichiers de verrouillage des gens "permanents".
BTW PR est le bienvenu
Je pense que la raison en est que le fil a été conçu à l'origine avec une seule commande install
qui a été divisée en install/add/upgrade
Donc pour vérifier si j'ai bien compris :
yarn
installe toutes les dépendances et modifie également le fichier de verrouillage. Sur un serveur CI, vous devriez utiliser yarn install --pure-lockfile
?
Pourquoi le fichier de verrouillage est-il modifié lors d'une installation ? Puisque vous ne mettez rien à niveau... Yarn devrait simplement installer les packages comme décrit dans le fichier de verrouillage, n'est-ce pas ?
Merci pour l'explication!
Le problème est que si le fichier de verrouillage est pur par défaut, les gens vont oublier de le mettre à jour car il s'agirait d'une commande distincte.
@kittens Le fichier de verrouillage ne devrait-il pas être mis à jour uniquement lors de l'ajout/suppression/mise à niveau de packages ? Ceux-ci doivent toujours mettre à niveau le fichier de verrouillage, ainsi qu'une installation initiale.
Le problème est que si le fichier de verrouillage est pur par défaut, les gens vont oublier de le mettre à jour car ce serait une commande distincte
Ce problème dépend de ce que vous considérez comme l'objectif principal d'un gestionnaire de paquets.
À mon avis, l'un des rôles remplis par un gestionnaire de packages est de faciliter au maximum le démarrage du développement d'un projet. Un simple yarn install
devrait obtenir tous les packages dont vous avez besoin pour commencer à développer, sans aucune confusion.
Avec npm
nombreux développeurs ont rejoint un projet, seulement pour découvrir qu'un projet ne fonctionnait pas sur leur machine. Ces instances se sont produites en raison de dépendances transitoires faisant passer les versions aux versions avec des modifications de rupture ou tout simplement ne suivant pas sever. J'avais espéré que yarn
résoudrait ces problèmes, mais si le point à retenir est que tous les développeurs d'un projet doivent exécuter yarn install --pure-lockfile
pour être sûr à 100% que le projet va se construire, alors ce n'est pas le cas. l'affaire.
Un autre rôle d'un gestionnaire de packages est de donner aux projets le contrôle de leurs dépendances. S'il est rendu pur par défaut, les développeurs peuvent consulter yarn outdated
pour voir les versions obsolètes, puis consulter les notes de modification, en évitant toute modification de rupture. Cela donnerait aux développeurs le contrôle total de ne modifier que les versions dans un délai de publication donné au lieu d'interdire aux développeurs de faire git commit -a
pour éviter les commits accidentels de fichiers de verrouillage.
Je suis d'accord avec tout ce que dit
Nous avons totalement surpris en cassant la construction après avoir commencé à utiliser yarn
pendant quelques jours. Honnêtement, je pensais que --pure-lockfile
était le comportement par défaut après avoir lu une grande partie de la documentation et sur la façon dont c'est mieux que npm avec du film rétractable. S'il vous plaît faire par défaut :)
@ide Imaginez un scénario où quelqu'un utilise simplement npm et met package.json
jour yarn.lock
va-t-il être mis à jour ?
Quelqu'un peut-il écrire les scénarios qui conduisent à la modification inattendue du fichier de verrouillage ? Ce changement est sérieux et fait du fichier de verrouillage un citoyen de deuxième classe en exigeant que les mises à jour soient explicites, ce qui signifie beaucoup de temps système pour se souvenir des opérations qui entraînent sa mise à jour, etc.
Plus d'informations sur ce qui précède : notre version a coffeescript de Github en tant que sous-dépendance. coffeescript a poussé quelques commits et nous avons obtenu un yarn.lock
modifié dans notre processus de construction en exécutant seulement yarn install
:
diff --git a/foo/yarn.lock b/foo/yarn.lock
index ec667fa..bb1f6ae 100644
--- a/foo/yarn.lock
+++ b/foo/yarn.lock
@@ -930,9 +930,9 @@ code-point-at@^1.0.0:
version "1.6.3"
resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.6.3.tgz#6355d32cf1b04cdff6b484e5e711782b2f0c39be"
-"coffee-script<strong i="8">@github</strong>:jashkenas/coffeescript":
+coffee-script@jashkenas/coffeescript:
version "1.11.1"
- resolved "https://codeload.github.com/jashkenas/coffeescript/tar.gz/887052de079b2f0af9f080031a00bb7544eaca08"
+ resolved "https://codeload.github.com/jashkenas/coffeescript/tar.gz/0d132318ce8f7116a436d97db1f2a5c8b1dedf28"
[email protected]:
version "0.3.0"
Quelqu'un peut-il écrire les scénarios qui conduisent à la modification inattendue du fichier de verrouillage ? Ce changement est sérieux et fait du fichier de verrouillage un citoyen de deuxième classe en exigeant que les mises à jour soient explicites, ce qui signifie beaucoup de temps système pour se souvenir des opérations qui entraînent sa mise à jour, etc.
Je perçois yarn install
comme une commande qui construit des node_modules pour moi.
C'est l'opposé de yarn add
et yarn remove
qui modifient package.json, fil.lock et cleanup node_modules.
Par opposition à add
et remove
Je cours install
100 fois plus souvent surtout en IC où je ne m'attends jamais à avoir des effets secondaires.
Exemples où je ne m'attends pas à ce que les choses changent :
yarn install
contre thread.lock qui a été généré par mes coéquipiers, j'obtiens un fichier thread.lock modifié que je dois me rappeler de ne pas valider.@chatons
Le problème est que si le fichier de verrouillage est pur par défaut, les gens vont oublier de le mettre à jour car il s'agirait d'une commande distincte.
Imaginez un scénario où quelqu'un utilise simplement npm et met à jour package.json, comment wire.lock va-t-il être mis à jour ?
Si nous supposons que yarn install
ne doit pas mettre yarn.lock
jour yarn.lock
n'est pas synchronisé avec package.json
pour mettre en évidence le fait qu'un yarn install --save-lockfile
est nécessaire pour tout synchroniser.
L'installation de +1 fil ne doit pas muter le fil.lock
Je ne suis pas inquiet de la mise à jour du fichier de verrouillage. Idéalement, greenkeeper le ferait lorsque deps change et nous pourrions alors fusionner le changement de fichier de verrouillage.
Je souhaite mettre à jour ce problème avec les réflexions actuelles à ce sujet. @kittens et moi pensons tous les deux que --pure-lockfile
ne devrait _pas_ être la valeur par défaut pour plusieurs raisons.
Cela commence par la façon dont les gens ajoutent/suppriment/mettent à jour des dépendances. Bien qu'il existe des commandes pour cela, il est courant de mettre à jour manuellement le package.json
à la main ou à l'aide d'un autre outil comme Lerna .
Une fois que vous avez modifié manuellement le package.json
l'attente dans Yarn et npm est que lorsque vous exécutez une autre installation, il se synchronise_ avec le package.json
. En ce sens, yarn install
pourrait presque être renommé yarn sync
.
En ce qui concerne la synchronisation, lorsque vous exécutez une installation avec de nouvelles dépendances, vous vous attendez à ce que le répertoire node_modules
reflète ces modifications. Étant donné que yarn.lock
agit comme un assistant pour node_modules
vous devez vous attendre à ce qu'il reste synchronisé de la même manière.
Votre package.json
est la source ultime de vérité, c'est votre interface avec le fil, c'est votre configuration et c'est la seule chose dont vous devriez vous préoccuper. Dans un monde idéal, vous engagez simplement vos yarn.lock
et ne devez plus jamais y penser.
En passant, je pense que de nombreuses personnes qui expriment leur soutien à ce problème sont confuses quant à ce qui est réellement discuté ici.
L'utilisation de --pure-lockfile
par défaut ne signifie pas que Yarn ne produit pas de résultats cohérents et fiables. Le même package.json
se traduira par le même yarn.lock
qui se traduira par le même node_modules
100% du temps.
Lorsque vous mettez à jour votre package.json
votre fichier yarn.lock
met à jour, puis vos mises à jour node_modules
. C'est un ordre très naturel des choses et nous devrions le garder ainsi
En ce qui concerne CI, la possibilité d'obtenir différentes dépendances lorsque vous avez mis à jour votre package.json
mais que vous n'avez pas exécuté yarn install
pour synchroniser tout ce que je suis sûr que quelqu'un évoquera (bien que je ne vois pas comme un problème)-- moi-même et d'autres avons parlé à divers outils CI sur l'intégration de Yarn, nous pouvons facilement les pousser à utiliser --pure-lockfile
par défaut si les gens voient cela comme un gros problème.
Si nous devions faire ce changement, cela aurait un impact négatif beaucoup plus souvent lors du changement de dépendances. Pour les raisons que j'ai énumérées, je dis que nous devrions clore cette question.
@thejameskyle , j'apprécierais si vous pouviez clarifier quelque chose :
package.json
qui contient une dépendance "foo": "^1.0.0"
yarn install
. Le package foo
est actuellement la version 1.0.0
, il crée donc un fichier yarn.lock
qui verrouille [email protected]
yarn.lock
à Git.yarn install
, mais foo
est maintenant mis à jour vers la version 1.1.0
, donc Yarn installe [email protected]
et écrase yarn.lock
avec la nouvelle version de foo
foo
subi un changement majeur dans la version 1.1.0
Voici une situation similaire :
package.json
qui contient une dépendance "foo": "^1.0.0"
, qui est verrouillée en tant que [email protected]
, et yarn.lock
est enregistré dans Git.yarn install
il obtient la version [email protected]
qui entraîne la mise à jour de yarn.lock
.foo
subi un changement majeur dans la version 1.1.0
Je pense que c'est le genre de situations qui inquiètent la plupart des gens.
Donc, si vous pouviez préciser que le comportement actuel de yarn install
n'a pas les problèmes ci-dessus, je pense que cela éliminerait la plupart de nos craintes. :+1:
Aucune de ces situations ne s'applique. Ce n'est pas parce qu'une dépendance a été mise à jour que vous l'obtiendrez, uniquement si vous avez apporté des modifications à votre package.json
.
Je vais simplement clore ce sujet car il semble vraiment que ce soit la seule préoccupation des gens, ce qui, comme je l'ai dit, n'est pas un scénario réel. Ce problème cause probablement plus de confusion.
Mais il a le mauvais comportement si une dépendance est installée à partir de github, comme je l'ai signalé ci-dessus
@adamchainz Cela devrait être corrigé séparément, nous pouvons facilement le verrouiller au commit
Aucune de ces situations ne s'applique. Ce n'est pas parce qu'une dépendance a été mise à jour que vous l'obtiendrez, uniquement si vous avez apporté des modifications à votre
package.json
.
@thejameskyle : Je ne suis pas sûr de comprendre pourquoi ce n'est pas un vrai scénario. Pourriez-vous s'il vous plaît élaborer?
Imaginez une fonction memoize où l'entrée est un package.json
et la sortie est le yarn.lock
.
package.json
il crée un yarn.lock
et met en cache le résultat.package.json
le résultat sera exactement le même car il est mis en cache.package.json
vous avez invalidé le cache et maintenant le yarn.lock
sera recalculé.Ce dont nous parlons en ce moment, c'est de se débarrasser de # 3 et de traiter à la place yarn.lock
comme s'il n'avait pas été invalidé par le package.json
modifié. Ce qui serait vraiment bizarre pour une fonction memoize et ce serait un comportement vraiment bizarre pour Yarn.
Ce qui arrive à un paquet en termes de commits et de nouvelles versions _devrait_ être sans importance (si nous avons un bogue avec les commits git, nous devrions le corriger séparément, mais ce n'est pas lié à ce problème).
C'est plus complexe que je ne l'avais imaginé (chaque version de package est effectivement "mémorisée" individuellement, changer la version d'un package n'invalide pas le reste), mais j'espère que maintenant tout le monde comprendra le point.
@thejameskyle : Par souci de clarté (et de curiosité), disons que j'ai un projet avec un fichier yarn.lock
, et que quelqu'un retire le référentiel. Sans exécuter yarn install
ou npm install
, cette personne ajoute une nouvelle dépendance au fichier package.json
puis exécute yarn install
. Le fichier yarn.lock
existant sera-t-il complètement ignoré dans ce cas ?
Il se passe un tas de choses différentes ici que je voulais essayer de démêler (sans jeu de mots).
Tout d'abord, les gens ont soulevé un certain nombre d'exigences différentes qui, je pense, ne prêtent pas à controverse (et qui rendent certains des bugs de comportement existants, auxquels je reviendrai bientôt).
Du rapport de bogue original.
La cohérence est perdue lorsque le fichier de verrouillage est modifié en fonction de l'environnement (version de fil actuellement installée).
Quel est le comportement attendu ?
N'écrivez pas fil.lock ou package.json lors de l'installation de fil.
Pour mettre à jour laine.lock, utilisez la mise à niveau de laine
Pour être plus précis, les sémantiques attendues, à mon avis, sont :
package.json
n'a pas changé depuis la dernière fois que yarn.lock
changé, yarn.lock
est la source de vérité et ne doit pas être mis à jour.package.json
a changé depuis la dernière fois, yarn.lock
changé, mettez yarn.lock
jour package.json
et mettez node_modules
jour yarn update
est exécuté, résolvez toutes les dépendances et obtenez la dernière version de tout ce qui satisfait le package.json
.Cela signifie que lorsqu'un dépôt est cloné pour la première fois sur une machine , si le yarn.lock
été archivé, fil doit toujours le traiter comme la source de vérité, ne pas générer de mises à jour du yarn.lock
, et sauter directement à l'étape d'extraction.
Dans la mesure où ce n'est pas le comportement actuel de laine, je pense que ce serait un bug.
@esphen a écrit :
Je suis d'accord. Il devrait y avoir une discussion sur la raison pour laquelle wire install écrit un fichier de verrouillage par défaut en premier lieu, car cela semble être en contradiction avec l'ensemble du concept de fichier de verrouillage. Pourquoi avoir un fichier de verrouillage s'il ne verrouille pas les versions par défaut ?
Je pense que ce que cela essaie de dire, c'est que fil ne doit pas écrire un nouveau fichier de verrouillage si celui qui existe est toujours à jour. Je suis d'accord avec ça.
Je suis d'accord avec l'opinion de @bestander selon laquelle seules les actions de mutation devraient mettre à jour le fichier de verrouillage par défaut, c'est-à-dire ajouter/mettre à niveau/supprimer.
Le principal problème ici est de savoir si une modification du package.json
devrait entraîner la mise yarn.lock
du package.json
n'est pas satisfait par le yarn.lock
, il doit mettre à jour le yarn.lock
.
Un invariant important des systèmes de fichiers de verrouillage comme le fil est que, en utilisant le flux de travail normal, les développeurs peuvent être sûrs que les packages qui sont réellement utilisés lorsqu'ils exécutent leur application correspondent aux versions spécifiées dans leur package.json
. Si le package.json
est autorisé à se désynchroniser avec le yarn.lock
, ce ne sera pas vrai, et le seul moyen de le savoir sera que les lecteurs humains lisent attentivement le yarn.lock
.
La meilleure façon pour la plupart des utilisateurs de penser au fichier de verrouillage est qu'il s'agit d'un artefact du fil en cours d'exécution qui représente les versions précises de tous les packages qui ont été utilisés pour le package.json
actuel. En l'enregistrant, les autres collaborateurs, CI et le code de production sont assurés d'utiliser ces mêmes versions.
@Guuz a dit :
Donc pour vérifier si j'ai bien compris :
fil installe toutes les dépendances et modifie également le fichier de verrouillage. Sur un serveur CI, vous devez utiliser wire install --pure-lockfile ?
Cette question fait écho à un sentiment que quelques personnes ont exprimé dans ce fil.
Cargo a un drapeau --locked
qui dit "si le package.json
n'est pas satisfait par le yarn.lock
, c'est une erreur grave". Bundler a un indicateur similaire ( --frozen
), qui a été ajouté lorsque Heroku a adopté Bundler, pour donner aux gens une erreur matérielle s'ils apportaient des modifications locales à leur Gemfile
et oubliaient de vérifier le Gemfile.lock
.
L'idée est que pendant votre développement normal, vous voudriez pouvoir apporter des modifications au package.json
et faire en sorte que le fil s'assure que le yarn.lock
reste synchronisé (encore une fois, pour s'assurer que les versions spécifiées dans package.json
correspondent toujours à ce qui est utilisé dans la pratique).
Mais lors du déploiement, c'est pratiquement toujours une erreur d'avoir divergé, car cela signifie que vous avez modifié package.json
, exécuté une commande locale yarn
et oublié d'enregistrer yarn.lock
. Cela signifie que les versions de votre package.json
ne correspondent pas aux versions réelles utilisées lors de l'exécution de l'application , ce qui, selon nous, viole un invariant fondamental de laine.
@esphen a dit :
À mon avis, l'un des rôles remplis par un gestionnaire de packages est de faciliter au maximum le démarrage du développement d'un projet. Une simple installation de fil devrait obtenir tous les packages dont vous avez besoin pour commencer à développer, sans aucune confusion.
Je pense que ce n'est pas controversé.
Avec npm, de nombreux développeurs ont rejoint un projet pour découvrir qu'un projet ne fonctionnait pas sur leur machine. Ces instances se sont produites en raison de dépendances transitoires faisant passer les versions aux versions avec des modifications de rupture ou tout simplement ne suivant pas sever. J'avais espéré que fil résoudrait ces problèmes, mais si le point à retenir est que tous les développeurs d'un projet doivent exécuter wire install --pure-lockfile pour être sûr à 100% que le projet va se construire, alors ce n'est pas le cas.
L'exécution de yarn install --pure-lockfile
signifie que le fichier de verrouillage sera respecté même si les versions à l'intérieur du fichier de verrouillage sont en conflit avec les versions spécifiées dans le package.json
. Cela ne devrait se produire que si un développeur oublie d'enregistrer son yarn.lock
après avoir modifié le package.json
.
Un autre rôle d'un gestionnaire de packages est de donner aux projets le contrôle de leurs dépendances. S'il est rendu pur par défaut, les développeurs peuvent consulter le fil obsolète pour voir les versions obsolètes, puis examiner les notes de modification, en évitant toute modification avec rupture. Cela donnerait aux développeurs le contrôle total de ne modifier que les versions dans un délai de publication donné au lieu d'interdire aux développeurs de faire git commit -a pour éviter les commits accidentels de fichiers de verrouillage.
Si le package.json
n'a pas changé, à mon avis c'est un bug si yarn.lock
est mis à jour. Au moins un cas de bogue semble être dans le rapport d'origine :
lockfile est modifié en fonction de l'environnement (version de fil actuellement installée).
Je pense que c'est une erreur et qu'il faut la corriger.
Plus tard dans le fil, @thejameskyle a déclaré :
Imaginez une fonction memoize où l'entrée est un package.json et la sortie est le fil.lock.
C'est exactement le bon modèle mental, à mon avis (" yarn.lock
peut changer si et seulement si package.json
changé"), et si l'abstraction fuit, nous devrions le réparer.
@adamchainz a dit :
Plus d'informations sur ce qui précède : notre version a coffeescript de Github en tant que sous-dépendance. coffeescript a poussé quelques commits et nous avons obtenu un fil.lock modifié dans notre processus de construction en exécutant juste l'installation de fil
et ensuite:
Mais il a le mauvais comportement si une dépendance est installée à partir de github, comme je l'ai signalé ci-dessus
Le problème ici est que fil ne traite pas le git sha comme faisant partie de la version verrouillée des dépendances git. Cargo et Bundler ont tous deux le concept d'une version « précise » qui est sérialisée dans le fichier de verrouillage ; pour les sources git, la version "précise" est le SHA. Ensuite, lorsque vous créez un nouveau clone avec seulement package.json
et yarn.lock
et exécutez yarn
, toutes les informations nécessaires pour obtenir précisément le code dont vous avez besoin sont là.
Je dois avouer que j'ai raté cette interaction lors de l'examen du code git d'origine ; il y a un certain suivi SHA dans le code, mais yarn install
ne garantit pas que le graphe de dépendance hydraté le respecte.
TL;DR
Je suis d'accord avec @thejameskyle et @kittens que yarn.lock
doit être synchronisé avec package.json
automatiquement, car je pense que les utilisateurs devraient pouvoir supposer que les versions spécifiées dans leur package.json
aligner avec ce qui est utilisé lorsque leur application est exécutée.
Cependant, il semble y avoir quelques bogues qui provoquent un taux de désabonnement inapproprié dans le yarn.lock
même lorsque le package.json
n'a pas changé :
package.json
n'a pas été mis à jour, ce qui met alors à jour le fichier de verrouillageNous devrions également considérer quelque chose comme le drapeau --locked
Cargo, que vous pouvez utiliser dans CI pour faire échouer rapidement la construction si un développeur met à jour le package.json
et oublie d'enregistrer le yarn.lock
.
@thejameskyle Merci ! :heart: Je suis d'accord avec vous et @kittens que yarn.lock
devrait être mis à jour après avoir modifié package.json
@wycats Un article très complet et perspicace comme d'habitude. :+1: Je suis d'accord avec toi, et j'aime aussi l'idée d'un drapeau --locked
(ou similaire). Nous devrions créer un nouveau problème à ce sujet.
Créé #1568 pour suivre le problème git SHA
@wycats , merci pour cet aperçu très éclairant et très instructif !
Cela signifie que lorsqu'un dépôt est cloné pour la première fois sur une machine, si le fil.lock a été archivé, fil doit toujours le traiter comme la source de vérité, ne pas générer de mises à jour du fil.lock et passer directement à l'étape de récupération.
Dans la mesure où ce n'est pas le comportement actuel de laine, je pense que ce serait un bug.
C'est exactement le scénario pour lequel cette question a été ouverte.
Nous avons quelques versions actives de Yarn dans l'entreprise et à notre échelle, je ne pense pas que nous pourrons faire des mises à jour atomiques partout.
Les constructions sur fil 0.13, 0.14 et 0.15 ont introduit de légères variations dans les fichiers fil.lock même si package.json était synchronisé.
Cela a causé quelques problèmes, par exemple les builds Buck ont été ralentis car les changements dans l'arborescence source invalident les caches.
Cela m'a causé, à moi et à quelques équipes, quelques heures de travail.
@thejameskyle , merci d'avoir partagé votre opinion.
Je ne considérais pas que le scénario de package.json désynchronisé avec fil.lock était juste. Et vous avez un point valable.
Cependant, comme l' a souligné
Il est important de résoudre ce problème pour avoir des versions valides et je rouvrirai le problème avec l'intention de trouver une solution qui satisfasse toutes les parties intéressées.
@wycats
Pour être plus précis, les sémantiques attendues, à mon avis, sont :
- si
package.json
n'a pas changé depuis la dernière fois queyarn.lock
changé,yarn.lock
est la source de vérité et ne doit pas être mis à jour.- si
package.json
a changé depuis la dernière fois,yarn.lock
changé, mettezyarn.lock
jourpackage.json
et metteznode_modules
jour- si
yarn update
est exécuté, résolvez toutes les dépendances et obtenez la dernière version de tout ce qui satisfait lepackage.json
.Cela signifie que lorsqu'un dépôt est cloné pour la première fois sur une machine , si le
yarn.lock
été archivé, fil doit toujours le traiter comme la source de vérité, ne pas générer de mises à jour duyarn.lock
, et sauter directement à l'étape d'extraction.
Ce sont les sémantiques que nous suivons que j'ai ajoutées en #364.
@bestander Vous avez été impliqué dans les relations publiques (#364) qui ont mis en place ces heuristiques. Quels changements supplémentaires proposez-vous?
Ce problème est extrêmement vaste et nous avons déjà convenu que --pure-lockfile
ne sera pas la valeur par défaut et nous suivrons les heuristiques décrites par @wycats. Si ce problème doit rester ouvert, le titre doit refléter le problème actuel avec ce comportement.
@kittens sonne bien, je mettrai à jour le problème.
Ou peut-être devrais-je en ouvrir un nouveau lié à l'installation en changeant le fichier de verrouillage lorsque package.json n'a pas changé
Pouvons-nous passer à un nouveau problème? Ces commentaires ici peuvent simplement être conservés en tant qu'archive
Ça a l' air bien,
Création du nouveau numéro ciblé https://github.com/yarnpkg/yarn/issues/1576
il serait intéressant d'avoir une option pour faire échouer yarn install
si le package dans package.json n'est pas dans fil.lock, c'est-à-dire. échouer si un paquet n'est pas verrouillé
Ajout d'une précision qui était encore ambiguë pour moi après avoir lu ce qui précède :
tldr; exécutez yarn install
, une dépendance de yarn.lock
entrée est modifiée seulement quand il est associé package.json
est modifié l' Les modifications non liées dans package.json
ne mettront pas à jour un package vers la dernière version compatible avec son serveur package.json
inchangé.
Sur la base de certaines des formulations ci-dessus, il semblait que yarn.lock
était mis en cache sur un hachage package.json
, et donc il semblait que yarn.lock
serait écrit (mis à jour / cache invalidé ) sur toute modification de package.json
, ce qui serait problématique car une modification non liée (c'est-à-dire une mise à jour vers "description"
ou une autre dépendance) pourrait entraîner la mise à jour de la version yarn.lock
cette dépendance une version plus récente dans le même serveur package.json
existant.
Cependant, j'ai vérifié que l'entrée yarn.lock
un package n'est écrite que lorsque le package.json
semver correspondant est mis à jour (même si le nouveau semver est compatible avec la version yarn.lock
existante, et par conséquent, ne nécessiterait pas autrement une mise à jour de version).
Par exemple,
yarn add lodash@^4.17.1
installe [email protected]
[email protected]
est disponible.[email protected]
package.json
(ou que l'ajout/la mise à niveau/la suppression de fil soit exécuté spécifiquement contre lodash).Fil d'Ariane #1576
D'ailleurs, si vous êtes prêt à contribuer aux documents avec de petits articles comme celui-ci, ce serait formidable pour la communauté.
L'équipe de base est toute occupée à résoudre les problèmes et à ajouter de nouvelles fonctionnalités et il est attendu et apprécié si la communauté aide à maintenir la documentation
@CrabDude merci d'avoir partagé vos éclaircissements.
Voulez-vous dire - dans votre exemple ci-dessus - que seuls lodash
et ses propres dépendances verront leurs versions de verrouillage mises à jour dans yarn.lock
? Par exemple, même si une autre dépendance pouvait avoir une nouvelle version de verrouillage, elle ne serait pas mise à jour en même temps ?
Ou un deuxième exemple : disons qu'un yarn.lock
est très obsolète et que l'utilisateur exécute yarn add
pour ajouter une nouvelle dépendance à package.json. Tous les autres packages obsolètes seront-ils désormais mis à jour dans yarn.lock
, ou resteront-ils les mêmes ?
@rarkins
Voulez-vous dire - dans votre exemple ci-dessus - que seuls lodash et ses propres dépendances verront leurs versions de verrouillage mises à jour dans fil.lock ?
Oui. Cela semble être confirmé dans mon exemple.
Tous les autres packages obsolètes seront-ils désormais mis à jour dans fil.lock, ou resteront-ils les mêmes ?
Il semblerait que les lodash
arbres de dépendances/entrées de verrous non lodash
le seraient.
De mon point de vue, chacun de ces éléments est à la fois souhaitable et attendu.
Préface : J'aime la laine. Mais cela me frustre sans fin.
Dans mon entreprise, yarn install
modifie constamment le fichier de verrouillage sur différentes machines (chacune exécutant la même version), bien qu'elle ne modifie jamais package.json
. Et quand nous le faisons, nous mettons à jour en utilisant yarn add
. C'est ennuyeux car CI vérifie que l'état de git est propre après une construction pour être sûr que nous n'avons pas oublié de faire des choses comme archiver un fichier de verrouillage, et cela change fréquemment.
Mon attente du fil était qu'il assurerait des node_modules identiques sur toutes les machines _par défaut_. Pas avec des drapeaux supplémentaires. Cela donnerait la priorité à l'exactitude plutôt qu'à la commodité. Si je voulais de l'incertitude, je pourrais utiliser npm directement. Lorsqu'un fichier change, c'est pour moi un signal que quelque chose l'a changé et je dois le scruter. Cela ne devrait pas changer.
Des questions
package.json
change, le fichier de verrouillage est régénéré. Cela ne pourrait-il pas involontairement changer beaucoup de dépendances en fonction de l'état des node_modules de ce programmeur particulier? Le fil doit déterminer un delta et essayer de préserver au mieux les verrous existants (s'il ne le fait pas déjà).yarn add
spécifie les versions dans package.json
avec un ^
? Encore une fois, j'ai compris que la promesse de fil était de geler les dépendances.Bogues liés
node_modules
, yarn install
indique le succès sans le réinstaller. Quand beaucoup d'entre eux sont partis, il les réinstalle. npm
est un peu plus approfondi à cet égard.node_modules
après une installation propre, le fil le régénère et est généralement très différent de la version précédente. C'est comme un compilateur produisant un code différent à chaque fois que vous l'exécutez sans rien changer.Dans l'ensemble, fil accélère les installations, mais semble échouer dans sa (in)compétence principale : geler les versions, de manière cohérente, par défaut. Je n'ai pas besoin de commodités qui m'aident à démarrer mon projet, j'ai besoin d'aide pour le maintenir au sein d'une énorme équipe pendant de nombreuses années. Les programmeurs sont intelligents et intentionnels, quand ils veulent un changement, ils le demandent explicitement.
Le fichier de verrouillage en constante évolution n'inspire pas confiance et est un problème constant. Je préférerais des avertissements et des erreurs indiquant que package.json ne correspond pas au fichier de verrouillage, que le fichier de verrouillage ne correspond pas à node_modules, qu'une version verrouillée n'existe plus, etc. prendre des décisions intentionnelles concernant mes dépendances.
@jspiro , merci d'avoir écrit ceci.
Il y a quelques problèmes soulevés ici.
Il vaudrait mieux ouvrir chaque numéro séparément sinon ils seront perdus dans les commentaires.
Êtes-vous sur la dernière version de Yarn?
À partir de 0.18-0.19, nous ne voyons pas de modifications des fichiers fils.lock entre les machines.
Des questions:
Est-il dit que malgré la modification du fichier de verrouillage, le contenu de node_modules sera toujours identique à celui de sa génération ? Je ne crois pas que ce soit le cas, mais si c'est le cas, alors je comprends la confusion dans ce fil - cela signifierait que le fil fait la bonne chose malgré l'apparence que ce n'est pas le cas.
Les dépendances de développement et facultatives peuvent être omises pour le même fichier de verrouillage.
Mais ceux qui sont installés par bing, à l'exception des packages spécifiques à la plate-forme, node_modules doit avoir des packages identiques à des endroits identiques.
Lorsque package.json change, le fichier de verrouillage est régénéré. Cela ne pourrait-il pas involontairement changer beaucoup de dépendances en fonction de l'état des node_modules de ce programmeur particulier? Le fil doit déterminer un delta et essayer de préserver au mieux les verrous existants (s'il ne le fait pas déjà).
C'est une belle demande de fonctionnalité, j'adorerais voir un PR pour cela.
Pourquoi le fil ajoute-t-il des versions spécifiées dans package.json avec un ^ ? Encore une fois, j'ai compris que la promesse de fil était de geler les dépendances.
Cela reflète le comportement de npm.
Vous pouvez faire yarn add [email protected]
ou yarn add is-array --exact
pour la version exacte.
Peut-être qu'à un moment donné, nous devrions faire des versions exactes par défaut, cela peut être une discussion dans un RFC.
Lorsqu'un package aléatoire est supprimé dans node_modules, l'installation de fil indique le succès sans le réinstaller. Quand beaucoup d'entre eux sont partis, il les réinstalle. npm est un peu plus approfondi à cet égard.
Le fil exécute une vérification rapide et superficielle par défaut.
Faire une vérification plus approfondie sera plus lent, mais nous y travaillons, j'ai une idée de la façon dont nous pourrions faire une vérification rapide et approfondie.
Cependant, vous n'êtes pas censé toucher aux fichiers dans node_modules, la vérification de chaque fichier pour modification entraînerait une expérience d'installation très lente.
Si vous souhaitez ignorer la vérification superficielle, supprimez le fichier node_modules/.yarn-integrity
avant l'installation. Ceci n'est pas officiel et peut changer.
Un moyen officiel consiste à exécuter yarn install --force
, cela forcerait l'installation complète mais cela réécrirait wire.lock comme effet secondaire.
Le fichier de verrouillage a tendance à être régénéré si vous supprimez node_modules et effectuez une installation propre (ce qui est littéralement le contraire de ce à quoi vous vous attendriez - je m'attends à ce qu'il installe exactement ce qu'il y a dans le fichier de verrouillage et ne fasse absolument rien d'autre)
Je n'ai pas vu ça depuis un moment.
Ouvrez un problème et mettez-moi un cc si cela peut être reproduit.
Si vous supprimez le fichier de verrouillage sans toucher au package ou aux node_modules après une installation propre, fil le régénère et est généralement très différent de la version précédente. C'est comme un compilateur produisant un code différent à chaque fois que vous l'exécutez sans rien changer.
Après un certain temps, de nouvelles versions des dépendances transitives peuvent avoir été publiées.
À cause de cela, la structure de node_modules peut changer de manière significative en raison de la logique de levage.
Cela fonctionne comme prévu.
Il y a une commande import
venir https://github.com/yarnpkg/yarn/pull/2580.
Cela vous permettrait de générer un fichier de verrouillage à partir de node_modules existants.
@jspiro , Yarn est un jeune projet communautaire, vos
Une chance d'obtenir au moins une option pour définir le comportement par défaut souhaité ?
Actuellement, nous résolvons ce problème https://github.com/yarnpkg/yarn/issues/3490 , parfois yarn install
peut entraîner l'optimisation du fichier de verrouillage, ce qui n'est pas un comportement attendu et nous le corrigerons.
C'est peut-être la raison pour laquelle vous demandez cette modification, sinon le fichier fil.lock ne devrait changer que si vous modifiez manuellement package.json.
Vous pouvez définir --pure-lockfile/--frozen-lockfile sur true dans .yarnrc et il sera ajouté à la commande d'installation par défaut :
--install.pure-lockfile true
Mon problème est que si je n'utilise pas pure-lockfile, j'obtiens la mauvaise version des dépendances installées. Ce n'est pas lié aux changements indésirables de fil.lock
Pouvez-vous soumettre un problème avec les étapes de repro ?
On va arranger ça
J'ai également été mordu par cela lorsqu'un package.json
et un yarn.lock
se sont désynchronisés en raison d'un développeur ajoutant par erreur une dépendance via npm install --save
au lieu de yarn add
.
Je ne suis pas d'accord cependant que pure-lockfile
devrait être la valeur par défaut et je soutiens que plutôt frozen-lockfile
devrait être la valeur par défaut pour yarn install
.
Comme frozen-lockfile
génère un message d'erreur si yarn.lock
et package.json
sont pas synchronisés. Le frozen-lockfile
est donc très utile sur une machine de construction (c'est-à-dire jenkins) car il marquera ces constructions, comme il faut s'y attendre, comme un échec.
C'est ensuite au développeur de décider quelle version ajouter dans le package.json / fil.lock.
La valeur par défaut malheureuse de yarn install
récupérera simplement la version la plus récente des dépendances non encore verrouillées et écrira une version mise à jour yarn.lock
, qui ne fera jamais partie du projet. Par conséquent, permettant de futures interruptions de la construction en raison d'une modification inattendue de la version. C'est la raison même pour laquelle nous avons un fichier de verrouillage pour commencer.
L'essentiel devrait être cependant :
Seules les commandes comme add
, remove
et upgrade
devraient muter le yarn.lock
.
install
devrait juste le faire, à savoir soit installer les dépendances dans leur version verrouillée, soit échouer s'il détecte une incompatibilité entre le package.json
et le yarn.lock
. (La seule exception étant s'il n'y a pas de yarn.lock
en premier lieu. Ensuite, et alors seulement, il peut en créer un, mais il ne devrait plus jamais le toucher.)
Le fichier de verrouillage gelé est donc très utile sur la machine de construction (c'est-à-dire jenkins) car ces constructions échoueront.
Je pense que nous pouvons activer cela automatiquement lorsque nous détectons que nous sommes en mode CI ?
@BYK Je n'avais pas réalisé que ce problème était fermé avant de l'ajouter ici. Dois-je peut-être en ouvrir un nouveau ou celui-ci peut-il être rouvert?
Je dirais en ouvrir un nouveau ☺️
Je suis d'accord avec @thejameskyle et @kittens que fil.lock doit être synchronisé automatiquement avec package.json
Je ne sais pas si cela a été dit, mais juste au cas où : vous n'avez pas besoin d'invalider le fil.lock entier lorsque quelque chose dans package.json change. Vous pouvez invalider uniquement les dépendances des packages qui ont été modifiés à l'intérieur de package.json. Par exemple, si vous n'avez mis à jour que TypeScript, les dépendances de TypeScript devraient être modifiées (en tenant compte des autres packages inchangés).
Commentaire le plus utile
Il se passe un tas de choses différentes ici que je voulais essayer de démêler (sans jeu de mots).
Tout d'abord, les gens ont soulevé un certain nombre d'exigences différentes qui, je pense, ne prêtent pas à controverse (et qui rendent certains des bugs de comportement existants, auxquels je reviendrai bientôt).
Du rapport de bogue original.
Pour être plus précis, les sémantiques attendues, à mon avis, sont :
package.json
n'a pas changé depuis la dernière fois queyarn.lock
changé,yarn.lock
est la source de vérité et ne doit pas être mis à jour.package.json
a changé depuis la dernière fois,yarn.lock
changé, mettezyarn.lock
jourpackage.json
et metteznode_modules
jouryarn update
est exécuté, résolvez toutes les dépendances et obtenez la dernière version de tout ce qui satisfait lepackage.json
.Cela signifie que lorsqu'un dépôt est cloné pour la première fois sur une machine , si le
yarn.lock
été archivé, fil doit toujours le traiter comme la source de vérité, ne pas générer de mises à jour duyarn.lock
, et sauter directement à l'étape d'extraction.Dans la mesure où ce n'est pas le comportement actuel de laine, je pense que ce serait un bug.
@esphen a écrit :
Je pense que ce que cela essaie de dire, c'est que fil ne doit pas écrire un nouveau fichier de verrouillage si celui qui existe est toujours à jour. Je suis d'accord avec ça.
Le principal problème ici est de savoir si une modification du
package.json
devrait entraîner la miseyarn.lock
dupackage.json
n'est pas satisfait par leyarn.lock
, il doit mettre à jour leyarn.lock
.Un invariant important des systèmes de fichiers de verrouillage comme le fil est que, en utilisant le flux de travail normal, les développeurs peuvent être sûrs que les packages qui sont réellement utilisés lorsqu'ils exécutent leur application correspondent aux versions spécifiées dans leur
package.json
. Si lepackage.json
est autorisé à se désynchroniser avec leyarn.lock
, ce ne sera pas vrai, et le seul moyen de le savoir sera que les lecteurs humains lisent attentivement leyarn.lock
.La meilleure façon pour la plupart des utilisateurs de penser au fichier de verrouillage est qu'il s'agit d'un artefact du fil en cours d'exécution qui représente les versions précises de tous les packages qui ont été utilisés pour le
package.json
actuel. En l'enregistrant, les autres collaborateurs, CI et le code de production sont assurés d'utiliser ces mêmes versions.@Guuz a dit :
Cette question fait écho à un sentiment que quelques personnes ont exprimé dans ce fil.
Cargo a un drapeau
--locked
qui dit "si lepackage.json
n'est pas satisfait par leyarn.lock
, c'est une erreur grave". Bundler a un indicateur similaire (--frozen
), qui a été ajouté lorsque Heroku a adopté Bundler, pour donner aux gens une erreur matérielle s'ils apportaient des modifications locales à leurGemfile
et oubliaient de vérifier leGemfile.lock
.L'idée est que pendant votre développement normal, vous voudriez pouvoir apporter des modifications au
package.json
et faire en sorte que le fil s'assure que leyarn.lock
reste synchronisé (encore une fois, pour s'assurer que les versions spécifiées danspackage.json
correspondent toujours à ce qui est utilisé dans la pratique).Mais lors du déploiement, c'est pratiquement toujours une erreur d'avoir divergé, car cela signifie que vous avez modifié
package.json
, exécuté une commande localeyarn
et oublié d'enregistreryarn.lock
. Cela signifie que les versions de votrepackage.json
ne correspondent pas aux versions réelles utilisées lors de l'exécution de l'application , ce qui, selon nous, viole un invariant fondamental de laine.@esphen a dit :
Je pense que ce n'est pas controversé.
L'exécution de
yarn install --pure-lockfile
signifie que le fichier de verrouillage sera respecté même si les versions à l'intérieur du fichier de verrouillage sont en conflit avec les versions spécifiées dans lepackage.json
. Cela ne devrait se produire que si un développeur oublie d'enregistrer sonyarn.lock
après avoir modifié lepackage.json
.Si le
package.json
n'a pas changé, à mon avis c'est un bug siyarn.lock
est mis à jour. Au moins un cas de bogue semble être dans le rapport d'origine :Je pense que c'est une erreur et qu'il faut la corriger.
Plus tard dans le fil, @thejameskyle a déclaré :
C'est exactement le bon modèle mental, à mon avis ("
yarn.lock
peut changer si et seulement sipackage.json
changé"), et si l'abstraction fuit, nous devrions le réparer.@adamchainz a dit :
et ensuite:
Le problème ici est que fil ne traite pas le git sha comme faisant partie de la version verrouillée des dépendances git. Cargo et Bundler ont tous deux le concept d'une version « précise » qui est sérialisée dans le fichier de verrouillage ; pour les sources git, la version "précise" est le SHA. Ensuite, lorsque vous créez un nouveau clone avec seulement
package.json
etyarn.lock
et exécutezyarn
, toutes les informations nécessaires pour obtenir précisément le code dont vous avez besoin sont là.Je dois avouer que j'ai raté cette interaction lors de l'examen du code git d'origine ; il y a un certain suivi SHA dans le code, mais
yarn install
ne garantit pas que le graphe de dépendance hydraté le respecte.TL;DR
Je suis d'accord avec @thejameskyle et @kittens que
yarn.lock
doit être synchronisé avecpackage.json
automatiquement, car je pense que les utilisateurs devraient pouvoir supposer que les versions spécifiées dans leurpackage.json
aligner avec ce qui est utilisé lorsque leur application est exécutée.Cependant, il semble y avoir quelques bogues qui provoquent un taux de désabonnement inapproprié dans le
yarn.lock
même lorsque lepackage.json
n'a pas changé :package.json
n'a pas été mis à jour, ce qui met alors à jour le fichier de verrouillageNous devrions également considérer quelque chose comme le drapeau
--locked
Cargo, que vous pouvez utiliser dans CI pour faire échouer rapidement la construction si un développeur met à jour lepackage.json
et oublie d'enregistrer leyarn.lock
.