IMHO ist diese Frage (und die meisten der folgenden Antworten) unvollständig, da die Frage "Wie und wann sollten wir die Datei yarn.lock neu generieren?" Fehlen.
MarkHu
1
Weißt du jetzt wie und wann?
Jayarjo
@ MarkHu fand es hier: yarnpkg.com/lang/en/docs/yarn-lock/#toc-managed-by-yarn Also im Grunde:Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.
Yarn generiert eine Datei yarn.lock im Stammverzeichnis Ihres Pakets. Sie müssen diese Datei nicht lesen oder verstehen - checken Sie sie einfach in die Quellcodeverwaltung ein.
Schöner Fund. Ich habe aus ihren Dokumenten Folgendes gefunden, das antwortet: "Wofür ist es?": "Der npm-Client installiert Abhängigkeiten nicht deterministisch in das Verzeichnis node_modules. Dies bedeutet, dass basierend auf der Reihenfolge Abhängigkeiten installiert werden, die Struktur eines node_modules Das Verzeichnis kann von Person zu Person unterschiedlich sein. Diese Unterschiede können dazu führen, dass Fehler auf meinem Computer auftreten, deren Suche lange dauert.
Rlay3
13
Fortsetzung: "Yarn behebt diese Probleme im Zusammenhang mit Versionierung und Nichtdeterminismus mithilfe von Sperrdateien und einem deterministischen und zuverlässigen Installationsalgorithmus. Diese Sperrdateien sperren die installierten Abhängigkeiten auf eine bestimmte Version und stellen sicher, dass jede Installation zu genau derselben Dateistruktur führt Knotenmodule auf allen Maschinen. "
Rlay3
Anstatt zu sagen "keine Sperrdatei gefunden". Es sollte nur "Generieren der Datei yarn.lock" stehen. Duh :) Es ist kein Fehler, aber der erstere klingt wie ein Fehler. Und letzteres wird für jeden im umgekehrten Szenario alarmierend genug sein (wo er erwartet, eine yarn.lock-Datei zu haben, aber anscheinend nicht).
Alexander Mills
7
Ich schätze, dass yarn.lock unser Projekt an bestimmte Paketversionen sperrt, aber ich finde die Verwendung des Wortes "lock" unglücklich. In der Regel sind Sperrdateien (z. B. .ldb ) ein Mittel, um eine Ressource auf jeweils einen Prozess zu beschränken, um zu verhindern, dass durch Aktualisierungen verursachte Aktualisierungen verursacht werden. Solche Sperrdateien sollten definitiv nicht zur Versionskontrolle verpflichtet werden, was möglicherweise der Grund für die größte Verwirrung in Bezug auf yarn.lock ist.
Antony
2
Ich mag den Satz "Sie müssen diese Datei nicht lesen oder verstehen" wirklich nicht. Dies ist eine wichtige Datei, um Ihr Projekt zu verwalten.
Nathan Goings
83
Kommt darauf an, was dein Projekt ist:
Ist Ihr Projekt eine Anwendung? Dann: Ja
Ist Ihr Projekt eine Bibliothek? Wenn ja: Nein
Eine ausführlichere Beschreibung hierzu finden Sie in dieser GitHub-Ausgabe, in der einer der Schöpfer von Yarn, z. sagt:
Die package.json beschreibt die beabsichtigten Versionen, die vom ursprünglichen Autor gewünscht werden, während yarn.lock die zuletzt als funktionierend bekannte Konfiguration für eine bestimmte Anwendung beschreibt.
Es wird nur die yarn.lockDatei des Projekts der obersten Ebene verwendet. Wenn also ein Projekt nicht eigenständig verwendet und nicht in einem anderen Projekt installiert wird, ist es nicht sinnvoll, eine yarn.lock-Datei festzuschreiben. Stattdessen liegt es immer an der package.json-Datei, zu übermitteln, welche Versionen von Abhängigkeiten das Projekt dann erwartet.
Würde andererseits die Sperrdatei in Bibliotheksprojekten nicht die Reproduzierbarkeit ihrer jeweiligen Tests beeinflussen?
E_net4 der enge Wähler
1
Wenn ich Ihre Beschreibung richtig gelesen habe, dann "Ist Ihr Projekt eine Bibliothek?" könnte mit "Wenn du willst" beantwortet werden. Es scheint keine Nachteile zu haben, könnte aber nützlich sein, wenn Sie komplexe devDependencies haben und möchten, dass jeder Entwickler Ihrer Bibliothek die gleichen Build- und Testskripte hat. Richtig?
Pipo
4
Da die Sperrdatei für keine Benutzer Ihrer Bibliothek respektiert wird, kann das
Verlassen
1
Dart hat das gleiche System wie pubspec.yaml und pubspec.lock und empfiehlt dasselbe wie in der Antwort. Siehe diese Frage und diesen Dokumentationseintrag.
Jonas Kello
16
Bitte beachten Sie diesen Eintrag in Garns offiziellem Blog:
Sperrdateien
66
Ich sehe, das sind zwei getrennte Fragen in einer. Lassen Sie mich beide beantworten.
Sollten Sie die Datei in Repo festschreiben?
Ja. Wie in der Antwort von ckuijjer erwähnt , wird im Migrationshandbuch empfohlen , diese Datei in das Repo aufzunehmen. Lesen Sie weiter, um zu verstehen, warum Sie dies tun müssen.
Was ist yarn.lock?
In dieser Datei werden die genauen Abhängigkeitsversionen für Ihr Projekt zusammen mit Prüfsummen für jedes Paket gespeichert. Auf diese Weise können Sie Ihre Abhängigkeiten konsistent gestalten.
Um zu verstehen, warum diese Datei benötigt wird, müssen Sie zunächst verstehen, was das Problem hinter den ursprünglichen NPMs war package.json. Wenn Sie das Paket installieren, speichert NPM den Bereich der zulässigen Revisionen einer Abhängigkeit anstelle einer bestimmten Revision (Semver). NPM versucht, die neueste Version der Abhängigkeit innerhalb des angegebenen Bereichs zu aktualisieren (dh nicht brechende Patch-Updates). Bei diesem Ansatz gibt es zwei Probleme.
Abhängigkeitsautoren veröffentlichen möglicherweise Patch-Versionsaktualisierungen, während sie tatsächlich eine wichtige Änderung einführen, die sich auf Ihr Projekt auswirkt.
Zwei Entwickler, die npm installzu unterschiedlichen Zeiten ausgeführt werden, erhalten möglicherweise unterschiedliche Abhängigkeiten. Dies kann dazu führen, dass ein Fehler in zwei genau gleichen Umgebungen nicht reproduzierbar ist. Dies kann beispielsweise zu Problemen mit der Build-Stabilität von CI-Servern führen.
Garn hingegen geht den Weg der maximalen Vorhersagbarkeit. Es wird eine yarn.lockDatei erstellt , um die genauen Abhängigkeitsversionen zu speichern . Wenn diese Datei vorhanden ist, werden Garne verwendet, die in gespeichert sind, yarn.lockanstatt Versionen von aufzulösen package.json. Diese Strategie garantiert, dass keines der oben beschriebenen Probleme auftritt.
yarn.lockähnelt dem npm-shrinkwrap.json, was per npm shrinkwrapBefehl erstellt werden kann . Überprüfen Sie diese Antwort und erläutern Sie die Unterschiede zwischen diesen beiden Dateien.
Fügen Sie es dem Repository hinzu und schreiben Sie es fest
Verwenden Sie yarn install --frozen-lockfileund NICHT yarn installals Standard sowohl lokal als auch auf CI-Build-Servern.
(Ich habe ein Ticket für den Issue-Tracker von Garn geöffnet, um einen Fall für das Standardverhalten von Frozen-Lockfile zu ermitteln, siehe # 4147 ).
Achten Sie darauf, das frozen-lockfileFlag NICHT in der .yarnrcDatei zu setzen, da dies verhindern würde, dass Sie die Dateien package.json und yarn.lock synchronisieren können. Siehe das zugehörige Garnproblem auf Github
Auch insb. In größeren Teams kann es zu starken Geräuschen bei Änderungen der Garnverriegelung kommen, nur weil ein Entwickler sein lokales Projekt eingerichtet hat.
Installieren Sie alle in package.json aufgeführten Abhängigkeiten im lokalen Ordner node_modules.
Das yarn.lock Datei wird wie folgt verwendet:
Wenn yarn.lock vorhanden ist und ausreicht, um alle in package.json aufgeführten Abhängigkeiten zu erfüllen, werden die genauen in yarn.lock aufgezeichneten Versionen installiert und yarn.lock bleibt unverändert. Das Garn sucht nicht nach neueren Versionen.
Wenn yarn.lock fehlt oder nicht ausreicht, um alle in package.json aufgeführten Abhängigkeiten zu erfüllen (z. B. wenn Sie package.json manuell eine Abhängigkeit hinzufügen), sucht Yarn nach den neuesten verfügbaren Versionen, die die Einschränkungen im Paket erfüllen .json. Die Ergebnisse werden in yarn.lock geschrieben.
Wenn Sie sicherstellen möchten, dass yarn.lock nicht aktualisiert wird, verwenden Sie --frozen-lockfile.
Dies stimmt zwar, das einzige Mal , dass ich denke, dass Sie würde haben zu verwenden --frozen-lockfileist , wenn jemand package.json manuell aktualisiert , ohne anschließend ausgeführt wird yarn installund die Updates zu begehen. Ein CI möchte dieses Flag möglicherweise verwenden, Entwickler jedoch nicht, da es die Probleme verbirgt.
Jkrehm
@jkrehm Kommt darauf an, was du mit dem Ausblenden von Problemen meinst. Ich hatte mehr Probleme mit unerwartet geänderten yarn.lockDateien yarn install, die entweder durch Aufblähen von Pull-Anforderungen oder durch unnötige Zusammenführungskonflikte oder durch das Abrufen einer fehlerhaften Bibliothek eingeführt wurden. (Nur weil eine Bibliothek Semvar verwendet, bedeutet dies nicht, dass ein Patch / ein kleines Update Ihre App nicht beschädigt - ich war dort). Ich denke yarn.lock, das Aktualisieren sollte nur ein manueller Schritt sein, weshalb ich mich auch auf meine Entwicklungsmaschine yarn install --frozen-lockfile(und npm ciauf npm-Projekte) verlasse, da diese zuverlässig und deterministisch ist.
k0pernikus
1
Ich hatte noch nie ein Problem damit yarn.lock, unerwartet aktualisiert zu werden (seit Oktober 2016, als es herauskam). Es war schon immer ein Benutzer, der etwas manuell gemacht hat oder ein mieses Skript nach der Installation. Das ist der Grund, warum ich Garn gegenüber NPM bevorzuge (NPM aktualisiert alles, wann immer es will). Ich schätze, ich schätze mich glücklich, nicht auf diese Probleme gestoßen zu sein.
7.
5
Aus meiner Erfahrung würde ich sagen, ja, wir sollten uns verpflichten yarn.lock Datei . Dadurch wird sichergestellt, dass andere Personen, die Ihr Projekt verwenden, dieselben Abhängigkeiten erhalten, die Ihr Projekt erwartet.
Wenn Sie entweder Garn oder Garn hinzufügen ausführen, generiert Yarn eine Datei yarn.lock im Stammverzeichnis Ihres Pakets. Sie müssen diese Datei nicht lesen oder verstehen - checken Sie sie einfach in die Quellcodeverwaltung ein. Wenn andere Benutzer Yarn anstelle von npm verwenden, stellt die Datei yarn.lock sicher, dass sie genau die gleichen Abhängigkeiten wie Sie erhalten.
Man argumentieren könnte, dass wir es durch den Austausch erreichen ^mit --. Ja, das können wir, aber im Allgemeinen haben wir festgestellt, dass die meisten npmPakete mit ^Notation geliefert werden, und wir müssen die Notation manuell ändern, um die statische Abhängigkeitsversion sicherzustellen. Wenn Sie sie jedoch verwenden yarn.lock, wird programmgesteuert Ihre korrekte Version sichergestellt.
Nicht .gitignore garn.lock. Es dient dazu, eine deterministische Abhängigkeitsauflösung sicherzustellen, um Fehler zu vermeiden, die auf meinem Computer auftreten.
Ja! yarn.lockmuss eingecheckt werden, damit jeder Entwickler, der die Abhängigkeiten installiert, genau die gleiche Ausgabe erhält! Mit npm [das im Oktober 2016 verfügbar war] können Sie beispielsweise eine patchVersion (z. B. 1.2.0) lokal installieren lassen, während ein neuer Entwickler, der eine neue installVersion ausführt, möglicherweise eine andere Version (1.2.1) erhält.
Das von Ihnen erwähnte npm-Verhalten hängt davon ab, wie Sie Ihre Abhängigkeiten speichern. Wenn Sie --save-exactbei Verwendung von npm mit speichern , können Sie dasselbe Verhalten erzielen.
AlicanC
4
@AlicanC Ich denke nicht, dass es so einfach ist. Ich glaube, dass Garn (durch eine festgeschriebene Sperrdatei) die gleiche Version von Paketen und alle ihre Abhängigkeiten garantiert . Dies ist etwas, mit dem NPM schon immer ein Problem hatte, da eine Abhängigkeit einer Abhängigkeit möglicherweise nicht an eine bestimmte Version gebunden ist, sodass bei einer Neuinstallation möglicherweise verschiedene Abhängigkeiten auf niedrigerer Ebene berücksichtigt werden. NPM Shrinkwrap sollte dieses Problem bis zu einem gewissen Grad lösen, aber es war immer schwierig und funktioniert sehr oft nicht richtig.
nextgentech
@nextgentech Wenn in diesem Fall, wie stelle ich sicher, dass die Abhängigkeit der Abhängigkeit ordnungsgemäß aktualisiert wird. Angenommen, ich habe ein Hauptpaket, das einige (sagen wir 3) abhängige Pakete enthält. Ich werde auf die Änderungen in meinem Hauptpaket achten und es in der package.json aktualisieren. Aber wenn eines der 3 Unterpakete von ihnen aktualisiert wird, wie bekomme ich die Änderungen? Aufgrund der Sperrdatei werden diese Abhängigkeiten nicht aktualisiert, oder?
Pragatheeswaran
Ich habe noch nicht viel damit herumgespielt, aber ich glaube, hier kommt der yarn upgradeBefehl ins Spiel. Dieser Befehl aktualisiert alle Pakete und erstellt die Sperrdatei neu. Wenn Sie beispielsweise eine App für die Produktion bereitstellen und die Abhängigkeiten installieren müssen, erfolgt dies basierend auf der aus dem Repository abgerufenen Sperrdatei. Sie sollten niemals ausgeführt werden, es yarn upgradesei denn, Sie möchten die Abhängigkeitsinformationen explizit ändern (und somit eine neue Sperrdatei festschreiben).
nextgentech
yarn installwird nicht die gleichen Versionen sicherstellen. Nur yarn install --frozen-lockfiletut.
Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.
Antworten:
Ja, Sie sollten es einchecken, siehe Migration von npm
quelle
Kommt darauf an, was dein Projekt ist:
Eine ausführlichere Beschreibung hierzu finden Sie in dieser GitHub-Ausgabe, in der einer der Schöpfer von Yarn, z. sagt:
Es wird nur die
yarn.lock
Datei des Projekts der obersten Ebene verwendet. Wenn also ein Projekt nicht eigenständig verwendet und nicht in einem anderen Projekt installiert wird, ist es nicht sinnvoll, eineyarn.lock
-Datei festzuschreiben. Stattdessen liegt es immer an derpackage.json
-Datei, zu übermitteln, welche Versionen von Abhängigkeiten das Projekt dann erwartet.quelle
Ich sehe, das sind zwei getrennte Fragen in einer. Lassen Sie mich beide beantworten.
Sollten Sie die Datei in Repo festschreiben?
Ja. Wie in der Antwort von ckuijjer erwähnt , wird im Migrationshandbuch empfohlen , diese Datei in das Repo aufzunehmen. Lesen Sie weiter, um zu verstehen, warum Sie dies tun müssen.
Was ist
yarn.lock
?In dieser Datei werden die genauen Abhängigkeitsversionen für Ihr Projekt zusammen mit Prüfsummen für jedes Paket gespeichert. Auf diese Weise können Sie Ihre Abhängigkeiten konsistent gestalten.
Um zu verstehen, warum diese Datei benötigt wird, müssen Sie zunächst verstehen, was das Problem hinter den ursprünglichen NPMs war
package.json
. Wenn Sie das Paket installieren, speichert NPM den Bereich der zulässigen Revisionen einer Abhängigkeit anstelle einer bestimmten Revision (Semver). NPM versucht, die neueste Version der Abhängigkeit innerhalb des angegebenen Bereichs zu aktualisieren (dh nicht brechende Patch-Updates). Bei diesem Ansatz gibt es zwei Probleme.Abhängigkeitsautoren veröffentlichen möglicherweise Patch-Versionsaktualisierungen, während sie tatsächlich eine wichtige Änderung einführen, die sich auf Ihr Projekt auswirkt.
Zwei Entwickler, die
npm install
zu unterschiedlichen Zeiten ausgeführt werden, erhalten möglicherweise unterschiedliche Abhängigkeiten. Dies kann dazu führen, dass ein Fehler in zwei genau gleichen Umgebungen nicht reproduzierbar ist. Dies kann beispielsweise zu Problemen mit der Build-Stabilität von CI-Servern führen.Garn hingegen geht den Weg der maximalen Vorhersagbarkeit. Es wird eine
yarn.lock
Datei erstellt , um die genauen Abhängigkeitsversionen zu speichern . Wenn diese Datei vorhanden ist, werden Garne verwendet, die in gespeichert sind,yarn.lock
anstatt Versionen von aufzulösenpackage.json
. Diese Strategie garantiert, dass keines der oben beschriebenen Probleme auftritt.yarn.lock
ähnelt demnpm-shrinkwrap.json
, was pernpm shrinkwrap
Befehl erstellt werden kann . Überprüfen Sie diese Antwort und erläutern Sie die Unterschiede zwischen diesen beiden Dateien.quelle
yarn.lock
dass ich ab und zu aktualisiert werde. Weißt du warum und wannyarn
das?yarn
Aktualisierungen durchgeführtyarn.lock
werden, einschließlich der Ausführungyarn install
ohne Änderungen an package.json. Die Verwendung deryarn install --frozen-lockfile
unter Warum wird das Ausführen von Garn unter Windows vorgeschlagenen Änderung von yarn.lock (oder das Konfigurieren über.yarnrc
) funktioniert am besten.package-lock.json
und einnpm ci
. Dieser Workflow ist analog zu Garnyarn.lock
undyarn install --frozen-lockfile
.Ich würde ja raten, da Yarn eine eigene yarn.lock-Datei hat: https://github.com/yarnpkg/yarn
Es wird für die deterministische Auflösung von Paketabhängigkeiten verwendet.
quelle
Du solltest:
yarn install --frozen-lockfile
und NICHTyarn install
als Standard sowohl lokal als auch auf CI-Build-Servern.(Ich habe ein Ticket für den Issue-Tracker von Garn geöffnet, um einen Fall für das Standardverhalten von Frozen-Lockfile zu ermitteln, siehe # 4147 ).
Achten Sie darauf, das
frozen-lockfile
Flag NICHT in der.yarnrc
Datei zu setzen, da dies verhindern würde, dass Sie die Dateien package.json und yarn.lock synchronisieren können. Siehe das zugehörige Garnproblem auf Githubyarn install
kann Ihr Garn.lock unerwartet mutieren und Garnansprüche von wiederholbaren Builds null und nichtig machen. Sie sollten nur verwendenyarn install
, um ein yarn.lock zu initialisieren und zu aktualisieren.Auch insb. In größeren Teams kann es zu starken Geräuschen bei Änderungen der Garnverriegelung kommen, nur weil ein Entwickler sein lokales Projekt eingerichtet hat.
Weitere Informationen finden Sie in meiner Antwort zu npm's package-lock.json, da dies auch hier gilt.
Dies wurde auch kürzlich in der Dokumenten für Garninstallation :
quelle
--frozen-lockfile
ist , wenn jemand package.json manuell aktualisiert , ohne anschließend ausgeführt wirdyarn install
und die Updates zu begehen. Ein CI möchte dieses Flag möglicherweise verwenden, Entwickler jedoch nicht, da es die Probleme verbirgt.yarn.lock
Dateienyarn install
, die entweder durch Aufblähen von Pull-Anforderungen oder durch unnötige Zusammenführungskonflikte oder durch das Abrufen einer fehlerhaften Bibliothek eingeführt wurden. (Nur weil eine Bibliothek Semvar verwendet, bedeutet dies nicht, dass ein Patch / ein kleines Update Ihre App nicht beschädigt - ich war dort). Ich denkeyarn.lock
, das Aktualisieren sollte nur ein manueller Schritt sein, weshalb ich mich auch auf meine Entwicklungsmaschineyarn install --frozen-lockfile
(undnpm ci
auf npm-Projekte) verlasse, da diese zuverlässig und deterministisch ist.yarn.lock
, unerwartet aktualisiert zu werden (seit Oktober 2016, als es herauskam). Es war schon immer ein Benutzer, der etwas manuell gemacht hat oder ein mieses Skript nach der Installation. Das ist der Grund, warum ich Garn gegenüber NPM bevorzuge (NPM aktualisiert alles, wann immer es will). Ich schätze, ich schätze mich glücklich, nicht auf diese Probleme gestoßen zu sein.Aus meiner Erfahrung würde ich sagen, ja, wir sollten uns verpflichten
yarn.lock
Datei . Dadurch wird sichergestellt, dass andere Personen, die Ihr Projekt verwenden, dieselben Abhängigkeiten erhalten, die Ihr Projekt erwartet.Aus dem Doc
Man argumentieren könnte, dass wir es durch den Austausch erreichen
^
mit--
. Ja, das können wir, aber im Allgemeinen haben wir festgestellt, dass die meistennpm
Pakete mit^
Notation geliefert werden, und wir müssen die Notation manuell ändern, um die statische Abhängigkeitsversion sicherzustellen. Wenn Sie sie jedoch verwendenyarn.lock
, wird programmgesteuert Ihre korrekte Version sichergestellt.Auch wie Eric Elliott hier sagte
quelle
Ja, du solltest es begehen. Weitere Informationen zur Datei yarn.lock finden Sie in den offiziellen Dokumenten hier
quelle
Ja!
yarn.lock
muss eingecheckt werden, damit jeder Entwickler, der die Abhängigkeiten installiert, genau die gleiche Ausgabe erhält! Mit npm [das im Oktober 2016 verfügbar war] können Sie beispielsweise einepatch
Version (z. B. 1.2.0) lokal installieren lassen, während ein neuer Entwickler, der eine neueinstall
Version ausführt, möglicherweise eine andere Version (1.2.1) erhält.quelle
--save-exact
bei Verwendung von npm mit speichern , können Sie dasselbe Verhalten erzielen.yarn upgrade
Befehl ins Spiel. Dieser Befehl aktualisiert alle Pakete und erstellt die Sperrdatei neu. Wenn Sie beispielsweise eine App für die Produktion bereitstellen und die Abhängigkeiten installieren müssen, erfolgt dies basierend auf der aus dem Repository abgerufenen Sperrdatei. Sie sollten niemals ausgeführt werden, esyarn upgrade
sei denn, Sie möchten die Abhängigkeitsinformationen explizit ändern (und somit eine neue Sperrdatei festschreiben).yarn install
wird nicht die gleichen Versionen sicherstellen. Nuryarn install --frozen-lockfile
tut.