Soll ich die Datei yarn.lock festschreiben und wofür ist sie gedacht?


305

Garn erstellt eine yarn.lockDatei, nachdem Sie a yarn install.

Sollte dies in das Repository übernommen oder ignoriert werden? Wofür ist das?


3
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.
Jayarjo

Antworten:


271

Ja, Sie sollten es einchecken, siehe Migration von npm

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.


33
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:

  1. Ist Ihr Projekt eine Anwendung? Dann: Ja
  2. 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.


7
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.

  1. Abhängigkeitsautoren veröffentlichen möglicherweise Patch-Versionsaktualisierungen, während sie tatsächlich eine wichtige Änderung einführen, die sich auf Ihr Projekt auswirkt.

  2. 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.


1
Aber ich sehe, yarn.lockdass ich ab und zu aktualisiert werde. Weißt du warum und wann yarndas?
Jayarjo

1
Die Garnprobleme Nr. 4379 und Nr. 4147 legen nahe, dass in vielen Fällen yarnAktualisierungen durchgeführt yarn.lockwerden, einschließlich der Ausführung yarn installohne Änderungen an package.json. Die Verwendung der yarn install --frozen-lockfileunter Warum wird das Ausführen von Garn unter Windows vorgeschlagenen Änderung von yarn.lock (oder das Konfigurieren über .yarnrc) funktioniert am besten.
Lauri Harpf

npm hat heutzutage ein package-lock.jsonund ein npm ci. Dieser Workflow ist analog zu Garn yarn.lockund yarn install --frozen-lockfile.
k0pernikus


8

Du solltest:

  1. Fügen Sie es dem Repository hinzu und schreiben Sie es fest
  2. 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


yarn installkann Ihr Garn.lock unerwartet mutieren und Garnansprüche von wiederholbaren Builds null und nichtig machen. Sie sollten nur verwenden yarn 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 :

yarn install

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.

Aus dem Doc

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.

Auch wie Eric Elliott hier sagte

Nicht .gitignore garn.lock. Es dient dazu, eine deterministische Abhängigkeitsauflösung sicherzustellen, um Fehler zu vermeiden, die auf meinem Computer auftreten.


3

Ja, du solltest es begehen. Weitere Informationen zur Datei yarn.lock finden Sie in den offiziellen Dokumenten hier


3

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.


1
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.
k0pernikus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.