Was ist der Sinn, den package-lock.json
von npm unter Versionskontrolle zu stellen? Nach meiner Erfahrung hat die Kontrolle dieser Dateiquelle mehr Probleme und Verwirrung verursacht als Effizienzsteigerungen.
Wenn Sie package-lock.json
unter Quellcodeverwaltung verwenden, ist jedes Mal ein Hauptkopfschmerz erforderlich, wenn ein Entwickler, der Knotenmodule hinzugefügt/entfernt/geändert hat, Konflikte lösen zwischen den Zweigen benötigt. Besonders bei komplexen/großen Apps, bei denen die package-lock.json Zehntausende Zeilen lang sein kann. Selbst wenn Sie einfach node_modules wegblasen und einen neuen npm install
ausführen, kann dies zu drastischen Änderungen in der Paketsperre führen.
Es gibt mehrere andere SO Fragen zur Paketsperre:
Und ein GitHub-Problem mit einer Menge Konversation über Package-Lock:
Ich denke, dass es immer noch weit verbreitete Ungewissheiten gibt, die beseitigt werden müssen.
Nach den Dokumenten
package-lock.json
wird automatisch für alle Vorgänge generiert, bei denen npm entweder die node_modules-Struktur oder package.json ändert.
Also warum sollten Sie jemals eine automatisch generierte Datei unter Quellcodeverwaltung setzen wollen?
In der obigen GitHub-Ausgabe wird beschrieben, wie einige Benutzer in Reaktion auf die Verwirrung mit package-lock.json ihr npm install
-Skript in rm -f package-lock.json && npm install
ändern, was sich ebenfalls als nicht korrekt anfühlt.
Es scheint, dass package-lock.json
bestrebt ist, die Quelle der Wahrheit für die genaue Version der Knotenmodulabhängigkeiten zu sein, aber ist das nicht genau das, was die package.json macht? Wann lohnt sich der quälende Schmerz der Lösung von Zusammenführungskonflikten in dieser Datei?
Nach meiner Erfahrung ist es macht keinen Sinn, package-lock.json
unter Versionskontrolle zu stellen. Es macht das Verwalten großer Zusammenführungen/Rebazien zu einem Albtraum. Es gibt jedoch Fälle, in denen die Paketsperre sehr nützlich sein kann.
Vor kurzem (2017/10/10) hat moment.js Änderungen in einem kleineren Versions-Update vorgenommen . Bedeutet wenn man ohne package-lock.json versenden sollte und hatte so etwas in der package.json:
"moment": "^2.12.0"
Einige grundlegende Änderungen, die in Version 2.19.0 eingeführt wurden, würden Ihren Code fast ohne Spur infiltrieren.
Deshalb ist es nach Abschneiden eines Zweigs als Release-Kandidat von entscheidender Bedeutung:
npm install
aus, um eine package-lock.json zu generierenDies stellt sicher, dass Ihre npm-Modulversionen für die gleichen Versionen, die getestet wurden, gesperrt bleiben.
Erstellen Sie einen .gitattributes-Eintrag:
# common settings that generally should always be used with your language specific settings
# Auto detect text files and perform LF normalization
* text=auto
#
# The above will handle all files NOT found below
#
#*.svg text
*.lock binary
Beim Zusammenführen müssen Sie dann lediglich eine Version und eine Code-Zusammenführung auswählen. Sie könnten auf diese Weise in Paketkonflikte geraten.
Wir haben das gemildert, indem Sie die Versionen im Build-Prozess überprüfen.
IMO package-lock.json
(oder yarn-lock.json
) sollte always für die Quellcodeverwaltung festgelegt werden. Merge/Rebase-Konflikte beiseite (die durch yarn
BTW weitgehend gemindert werden - Sie können yarn install
in der Zwischenzeit die Probleme automatisch lösen), es ist die beste Garantie, dass der Code bei diesem Commit nach einer erneuten Prüfung und Installation korrekt erstellt und ausgeführt wird .