wake-up-neo.com

Was ist der Sinn, wenn npm's "package-lock.json" unter Versionskontrolle gestellt wird?

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?

14
Cumulo Nimbus

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:

  • entfernen Sie package-lock.json aus .gitignore
  • führen Sie npm install aus, um eine package-lock.json zu generieren
  • testen, qa, mit dieser Paketsperre implementieren

Dies stellt sicher, dass Ihre npm-Modulversionen für die gleichen Versionen, die getestet wurden, gesperrt bleiben.

8
Cumulo Nimbus

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.

3
Fitch

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 .

0
linguamachina