npm @ 5 wurde veröffentlicht, es hat eine neue Funktion package-lock.json Datei (nach npm install
), die mich verwirrt. Ich möchte wissen, wie sich diese Datei auswirkt.
Es speichert einen exakten, versionierten Abhängigkeitsbaum, anstatt eine markierte Versionierung wie package.json selbst zu verwenden (z. B. 1.0. *). Dies bedeutet, dass Sie die Abhängigkeiten für andere Entwickler oder Produktversionen usw. garantieren können. Es verfügt auch über einen Mechanismus zum Sperren des Baums, wird jedoch im Allgemeinen neu generiert, wenn sich package.json ändert.
Aus den npm-Dokumenten :
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 unabhängig von Zwischenabhängigkeitsaktualisierungen identische Bäume generieren können.
Diese Datei soll in Quell-Repositorys festgeschrieben werden und dient verschiedenen Zwecken:
Beschreiben Sie eine einzelne Darstellung eines Abhängigkeitsbaums, sodass Teammitglieder, Bereitstellungen und kontinuierliche Integration garantiert genau dieselben Abhängigkeiten installieren.
Bieten Sie Benutzern die Möglichkeit, "Zeitreisen" zu früheren Status von node_modules zu unternehmen, ohne das Verzeichnis selbst festschreiben zu müssen.
Um eine bessere Sichtbarkeit von Baumänderungen durch lesbare Unterschiede in der Quellcodeverwaltung zu ermöglichen.
Und optimieren Sie den Installationsprozess, indem Sie npm erlauben, wiederholte Metadatenauflösungen für zuvor installierte Pakete zu überspringen. "
Um die folgende Frage von jrahhali zu beantworten, wie man nur die package.json mit genauen Versionsnummern verwendet. Beachten Sie, dass Ihre package.json nur Ihre direkten Abhängigkeiten enthält, nicht die Abhängigkeiten Ihrer Abhängigkeiten (manchmal auch als verschachtelte Abhängigkeiten bezeichnet). Dies bedeutet, dass Sie mit der Standarddatei package.json die Versionen dieser verschachtelten Abhängigkeiten nicht steuern können. Eine direkte Referenzierung oder Peer-Abhängigkeiten helfen nicht, da Sie auch nicht die Versionstoleranz steuern, die Ihre direkten Abhängigkeiten für diese verschachtelten Abhängigkeiten definieren .
Selbst wenn Sie die Versionen Ihrer direkten Abhängigkeiten sperren, können Sie nicht 100% ig garantieren, dass Ihr vollständiger Abhängigkeitsbaum jedes Mal identisch ist. Zweitens möchten Sie möglicherweise nicht unterbrechende Änderungen (basierend auf der semantischen Versionierung) Ihrer direkten Abhängigkeiten zulassen, wodurch Sie noch weniger Kontrolle über verschachtelte Abhängigkeiten haben. Außerdem können Sie nicht garantieren, dass Ihre direkten Abhängigkeiten irgendwann nicht gegen semantische Versionsregeln verstoßen sich.
Die Lösung für all dies ist die Sperrdatei, die wie oben beschrieben die Versionen des vollständigen Abhängigkeitsbaums sperrt. Auf diese Weise können Sie Ihren Abhängigkeitsbaum für andere Entwickler oder für Releases garantieren und gleichzeitig neue Abhängigkeitsversionen (direkt oder indirekt) mit Ihrem Standardpaket.json testen.
NB. Der vorherige Shrink Wrap JSON hat so ziemlich das Gleiche getan, aber die Sperrdatei benennt ihn um, damit die Funktion klarer wird. Wenn das Projekt bereits eine Shrink-Wrap-Datei enthält, wird diese anstelle einer Sperrdatei verwendet.
package-lock.json
Datei wird seit NPM 5.1 jedes Mal aktualisiert, wenn Sie npm install aufrufen . (Änderung in github.com/npm/npm/issues/16866 , Beispiel in github.com/npm/npm/issues/17979 ) Daher können nicht mehr für alle Entwickler dieselben Versionen festgelegt werden , es sei denn, Sie geben genaue Versionen an wie1.2.3
statt1.2.*
in Ihrerpackage.json
Datei.npm ci
as hinzufügen,npm install
um die package-lock.json zu aktualisieren, während ci seinen Inhalt verwendet. Nur mit erhaltennpm ci
Sie wiederholbare robuste Builds.Es ist eine sehr wichtige Verbesserung für npm: garantieren Sie genau die gleiche Version jedes Pakets .
Wie stellen Sie sicher, dass Ihr Projekt mit denselben Paketen in unterschiedlichen Umgebungen zu unterschiedlichen Zeiten erstellt wurde? Nehmen wir an, Sie können
^1.2.3
in Ihrerpackage.json
oder einigen Ihrer Abhängigkeiten diese verwenden, aber wie können Sie sicherstellen, dass jedes Malnpm install
dieselbe Version auf Ihrem Entwicklungscomputer und auf dem Build-Server abgerufen wird? package-lock.json wird dies sicherstellen.npm install
generiert die Sperrdatei neu, wenn dies auf einem Build-Server oder einem Bereitstellungsserver erfolgtnpm ci
(der aus der Sperrdatei liest und den gesamten Paketbaum installiert).quelle
package-lock.json
Datei. Es wird einfach so installiert,package.json
wie es früher war. Um diepackage-lock.json
Datei nutzen zu können, müssen Sie den neuen Befehl "npm ci" verwenden, mit dem die genauen Versionen installiert werden, die inpackage-lock.json
anstelle der angegebenen Versionsbereiche aufgeführt sindpackage.json
.npm install
nicht lesen auspackage-lock.json
. Gehen Sie zum Reproduzieren wie folgt vor. mit dieser package.json, laufennpm install
{... "devDependencies": { "Sinon": "7.2.2"}} Jetzt kopieren / einfügenpackage.json
undpackage-lock.json
in ein neues Verzeichnis. Wechseln Siepackage.json
zu: "sinon": "^ 7.2.2" runnpm install
. npm liest aus package-lock.json und installiert 7.2.2 anstelle von 7.3.0. Ohne package-lock.json würde 7.3.0 installiert.package-lock.json
, ist der einzig vernünftige Weg, dies zu löschenpackage-lock.json
und neu zu generierennpm install
. (Sie möchten nicht manuell bearbeitenpackage-lock.json
). Wenn Sie den Wert der "version" -Eigenschaft (oben)package.json
ändern, ändert sich das gleiche inpackage-lock.json
onnpm install
, aber das Hinzufügen eines Carets zu einer Abhängigkeit bewirkt nicht dasselbepackage-lock.json
.package.json
Sie sich etwas vor, das Sie manuell ändern können, undpackage-lock.json
etwas, das Sie niemals manuell berühren. Sie kontrollieren immer BEIDE Dateien - insbesonderepackage-lock.json
. Öffnen Sie beide Dateien, bearbeiten Sie den Projektnamen manuellpackage.json
, führen Sie ihn ausnpm install
und beobachten Sie, wie sich der Projektname ändertpackage-lock.json
.license
scheint nicht aufgenommen zu seinpackage-lock.json
.npm ci
,npm install
wird nur package.json verwenden, auch wenn die Lock - Datei zur Verfügung gestellt wirdpackage-lock.json
wird geschrieben, wenn ein numerischer Wert in einer Eigenschaft wie der Eigenschaft "version" oder eine Abhängigkeitseigenschaft in geändert wirdpackage.json
.Wenn diese Zahlenwerte übereinstimmen
package.json
undpackage-lock.json
übereinstimmen,package-lock.json
wird aus gelesen.Wenn diese numerischen Werte in
package.json
undpackage-lock.json
nicht übereinstimmen,package-lock.json
wird mit diesen neuen Werten und neuen Modifikatoren wie Caret und Tilde, falls vorhanden, geschrieben. Aber es ist die Ziffer, die die Änderung zu auslöstpackage-lock.json
.Um zu sehen, was ich meine, gehen Sie wie folgt vor. Verwenden Sie
package.json
ohnepackage-lock.json
, führen Sienpm install
mit:package-lock.json
wird jetzt haben:Kopieren Sie nun beide Dateien in ein neues Verzeichnis. Wechseln
package.json
zu (nur Caret hinzufügen):laufen
npm install
. Wenn es keinepackage-lock.json
Datei gäbe, würde [email protected] installiert.npm install
ist das Lesen auspackage-lock.json
und 7.2.2 installieren.Wechseln Sie nun
package.json
zu:laufen
npm install
.package-lock.json
wurde an geschrieben und wird nun zeigen:quelle
Eine wichtige Sache, die ebenfalls erwähnt werden muss, ist die Sicherheitsverbesserung, die mit der Paketsperrdatei einhergeht. Da alle Hashes der Pakete beibehalten werden, wenn jemand die öffentliche npm-Registrierung manipuliert und den Quellcode eines Pakets ändert, ohne auch nur die Version des Pakets selbst zu ändern, wird dies von der Paketsperrdatei erkannt.
quelle
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 unabhängig von Zwischenabhängigkeitsaktualisierungen identische Bäume generieren können.
Es beschreibt eine einzelne Darstellung eines Abhängigkeitsbaums, sodass Teammitglieder, Bereitstellungen und kontinuierliche Integration garantiert genau dieselben Abhängigkeiten installieren. Sie enthält die folgenden Eigenschaften.
}}
quelle
Diese Datei wird automatisch von npm erstellt und verwendet, um Ihre Paketinstallationen zu verfolgen und den Status und den Verlauf der Abhängigkeiten Ihres Projekts besser zu verwalten. Sie sollten den Inhalt dieser Datei nicht ändern.
quelle
package-lock.json: Enthält die genauen Versionsdetails, die derzeit für Ihre Anwendung installiert sind.
quelle