Soll ich die Dateien yarn.lock und package-lock.json festschreiben?

Antworten:

146

Übernehmen Sie im Allgemeinen immer Abhängigkeits-Sperrdateien

Wie abgedeckt anderswo, Abhängigkeit Lock - Dateien, die von vielen Paket - Management - Systemen unterstützt werden (zB: Komponist und Bündler ), sollte die Code - Basis in End-of-Chain - Projekten verpflichtet werden - so dass jedes einzelne versuchen, dieses Projekt auszuführen tut also mit genau dem getesteten Satz von Abhängigkeiten.

Es ist weniger klar, ob Sperrdateien immer in Paketen festgeschrieben werden sollen, die in anderen Projekten enthalten sein sollen (wo lockerere Abhängigkeiten wünschenswert sind). Doch sowohl Garn und NPM (wie durch @Cyrille abgedeckt) intelligent ignorieren yarn.lockund package-lock.jsonjeweils dort notwendig , wo es sicher zu machen, immer diese Lock - Dateien zu begehen.

Sie sollten also immer mindestens einen von yarn.lockoderpackage-lock.json abhängig davon verwenden, welchen Paketmanager Sie verwenden.

Sollten Sie sowohl yarn.lock als auch package-lock.json festschreiben?

Derzeit haben wir zwei verschiedene Paket - Management - Systeme, die beide installieren den gleichen Satz von Abhängigkeiten aus package.json, aber die erzeugen und lesen aus zwei verschiedenen Lock - Dateien. NPM 5 erzeugt package-lock.json, während Garn erzeugt yarn.lock.

Wenn Sie ein Commit durchführen, bauen package-lock.jsonSie die Unterstützung für Personen ein, die Ihre Abhängigkeiten mit NPM 5 installieren. Wenn Sie ein Commit durchführen yarn.lock, bauen Sie die Unterstützung für Personen ein, die Abhängigkeiten mit Yarn installieren.

Ob Sie sich für ein Commit yarn.lockoder package-lock.jsonbeides entscheiden, hängt davon ab, ob diejenigen, die sich in Ihrem Projekt entwickeln, nur Yarn oder NPM 5 oder beides verwenden. Wenn Ihr Projekt Open Source ist, ist es wahrscheinlich das Community-freundlichste, beides zu verpflichten und einen automatisierten Prozess zu haben, um sicherzustellen yarn.lockund package-lock.jsonimmer synchron zu bleiben.

Update: Yarn hat jetzt einen importBefehl eingeführt, der eine yarn.lockDatei aus einer package-lock.jsonDatei generiert . Dies kann nützlich sein, um die beiden Dateien synchron zu halten. (Danke @weakish)


Dieses Thema wurde im Rahmen des Garnprojekts ausführlich erörtert in:

Beide sind jetzt geschlossen.

Robin Winslow
quelle
1
Gute Antwort. Zu Ihrem Standpunkt: "Am sichersten ist es, beide zu generieren und festzuschreiben, wenn sich Ihre Abhängigkeiten ändern." Ich bin mir nicht sicher, warum dies das "sicherste" ist. Wie Sie bereits erwähnt haben, ist es sehr wahrscheinlich, dass "die beiden Dateien nicht mehr synchron sind". Die Antwort von @ crimbo erklärt dieses Problem ausführlicher.
TachyonVortex
Ich denke, dies könnte ein Unterschied darin sein, ob Sie alle Personen kontrollieren können, die Ihr Projekt ausführen. Wenn Sie das Team besitzen, standardisieren Sie auf Garn und verwenden Sie yarn.lock. Aber wenn es sich um ein Open-Source-Projekt handelt (wie alle unsere), verwenden die Leute möglicherweise NPM für Ihre Projekte, obwohl Sie Yarn intern verwenden. Am sichersten wäre es also, ein automatisiertes System zu verwenden, um sicherzustellen, dass sowohl yarn.lock als auch package-lock.json synchron bleiben. Und üben Sie auch Druck auf Yarn aus, um zu package-lock.json zu wechseln.
Robin Winslow
1
yarn importwurde im Jahr 2018 eingeführt. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
schwach
18

Sie sollten 1 Abhängigkeitsbaumsperrdatei festschreiben, aber nicht beide. Dies erfordert auch die Standardisierung auf Garn oder npm (nicht auf beiden), um ein Projekt mit zu erstellen und zu entwickeln.

Hier ist der Garnartikel darüber, warum yarn.lock festgeschrieben werden sollte, wenn Sie auf Garn standardisieren.

Wenn Sie sowohl die yarn.lockDatei als auch die package-lock.jsonDateien festschreiben , gibt es viele Möglichkeiten, wie die beiden Dateien unterschiedliche Abhängigkeitsbäume bereitstellen können (selbst wenn die Baumauflösungsalgorithmen von Garn und npm identisch sind), und es ist nicht trivial, sicherzustellen, dass sie genau die bereitstellen gleiche Antwort. Da dies nicht trivial ist, ist es unwahrscheinlich, dass in beiden Dateien derselbe Abhängigkeitsbaum beibehalten wird, und Sie möchten kein unterschiedliches Verhalten, je nachdem, ob der Build mit Garn oder npm durchgeführt wurde.

Wenn das Garn von der Verwendung yarn.lockzu wechselt package-lock.json( Problem hier ), wird die Auswahl der zu festschreibenden Sperrdatei einfach, und wir müssen uns nicht mehr um Garn und npm kümmern, was zu unterschiedlichen Builds führt. Basierend auf diesem Blog-Beitrag ist dies eine Änderung, die wir nicht bald erwarten sollten (der Blog-Beitrag beschreibt auch die Unterschiede zwischen yarn.lockund package-lock.json.

Crimbo
quelle
11

Ich habe über die gleiche Frage nachgedacht. Hier sind meine Gedanken, hoffe es hilft:

In der Dokumentation zu npm package-lock.json heißt es:

package-lock.json wird automatisch für alle Vorgänge generiert, bei denen npm entweder den Baum node_modules oder package.json ändert. Es beschreibt den genauen Baum, der generiert wurde, sodass nachfolgende Installationen identische Bäume generieren können, unabhängig von zwischenzeitlichen Abhängigkeitsaktualisierungen.

Dies ist großartig, da es den Effekt "Funktioniert auf meinem Computer" verhindert.

Ohne diese Datei wird npm install --save Anpm "A": "^1.2.3"zu Ihrer hinzugefügt package.json. Wenn jemand anderes in npm installIhrem Projekt ausgeführt wird, wurde möglicherweise die Version 1.2.4von Averöffentlicht. Da es sich um die neueste verfügbare Version handelt, die den in Ihrem angegebenen Semver-Bereich erfüllt package.json, wird diese Version installiert. Aber was ist, wenn in dieser Version ein neuer Fehler eingeführt wurde? Diese Person hat ein Problem, das Sie nicht reproduzieren können, da Sie die vorherige Version ohne Fehler haben.

Durch das Korrigieren des Status Ihres node_modulesVerzeichnisses package-lock.jsonverhindert file dieses Problem, da jeder die gleichen Versionen aller Pakete hat.

Aber was ist, wenn Sie ein npm-Modul schreiben und veröffentlichen? In der Dokumentation heißt es:

Ein wichtiges Detail von package-lock.json ist, dass es nicht veröffentlicht werden kann und ignoriert wird, wenn es an einer anderen Stelle als dem Paket der obersten Ebene gefunden wird.

Selbst wenn Sie es festschreiben, erhält der Benutzer bei der Installation Ihres Moduls nicht die package-lock.jsonDatei, sondern nur die package.jsonDatei. Daher installiert npm die neueste Version, die die Semver-Bereiche aller Ihrer Abhängigkeiten erfüllt. Dies bedeutet, dass Sie Ihr Modul immer mit diesen Versionen Ihrer Abhängigkeiten testen möchten und nicht mit der, die Sie installiert haben, als Sie mit dem Schreiben Ihres Moduls begonnen haben. In diesem Fall package-lock.jsonist es also eindeutig nutzlos. Mehr noch, es kann nervig sein.

Cyrille
quelle
7

Hier ist meine Faustregel: Wenn Sie an einer Anwendung arbeiten, schreiben Sie die Sperrdatei (en) fest. Wenn Sie eine Bibliothek verwalten, fügen Sie sie Ihrer ignorierten Liste hinzu. In beiden Fällen sollten Sie genaue Semverbereiche in verwenden package.json. Yehuda Katz ( zwischengespeichert ) hat eine großartige Erklärung geschrieben, wann Gemfile.lock(Commys Sperrdatei) festgeschrieben werden soll und wann nicht. Lesen Sie zumindest den Abschnitt tl; dr.

Ravinggenius
quelle
Die Verbindung ist unterbrochen.
Juha Syrjälä
Danke @ JuhaSyrjälä. Ich habe dem Artikel einen zweiten Link hinzugefügt.
Ravinggenius
Wo ist die Ignorierliste für npm oder Garn?
Neves
"Liste ignorieren" ist spezifisch für das Quell-Repository Ihres Projekts (Git, Mercurial, Subversion). Im Fall von git wird die Datei aufgerufen .gitignoreund befindet sich normalerweise im Stammverzeichnis des Projekts.
Ravinggenius
4

Du hast Recht! Beides zuzulassen npmund verwendet yarnzu werden, wird Probleme verursachen. Schauen Sie sich diesen Artikel an .

Derzeit planen wir, Benutzern, die beide yarn und npmdasselbe Repository zum Installieren von Paketen verwenden , einige Warnungen hinzuzufügen .

Wir empfehlen Ihnen dringend, die package-lock.jsonDatei zu löschen , wenn Sie Garn verwenden, um zukünftige Verwirrung und mögliche Konsistenzprobleme zu vermeiden.

Möglicherweise möchten Sie nicht beide npmund yarnals Ihren Paketmanager.

BinaryJoe01
quelle
2

Diese Dateien werden von Ihren Tools verwaltet. Unter der Annahme, dass die Verwendung von Garn das Update effektiv aktualisiert package-lock.json, funktioniert das Festschreiben beider Dateien vermutlich einwandfrei.

Ich denke , das wichtigste für Ihre Benutzer ist package-lock.json(ich zum Beispiel nicht Garn verwenden) , um dies hat begangen werden.

Für die yarn.lockkommt es darauf an, ob Sie alleine oder im Team arbeiten. Wenn solo, dann besteht wohl keine Notwendigkeit, es zu begehen. Wenn Sie in einem Team arbeiten möchten, sollten Sie es wahrscheinlich festlegen , zumindest bis das Garn es unterstützt 🙂

Ich nehme an, das Garnteam wird irgendwann aufhören zu verwenden yarn.lockund package-json.lockstattdessen verwenden, zu diesem Zeitpunkt wird es einfacher 😛

dohzya
quelle
1
Das hat nicht aufgehört, yarn.lock zu verwenden.
Jayarjo
0

Nein, die gleichzeitige Verwendung beider Sperrdateien führt meistens zu Inkonsistenzen in Ihrem Abhängigkeitsbaum, insbesondere bei der Zusammenarbeit in einem Team. Das Ignorieren des einen oder anderen Schlosses ist eine einfache Lösung. Stellen Sie einfach sicher, dass Ihr Team diese Änderung versteht und damit einverstanden ist.

AndrewSteinheiser
quelle