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.
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.
Antworten:
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 wie 1.2.3
statt 1.2.*
in Ihrer package.json
Datei.
npm ci
as hinzufügen, npm install
um die package-lock.json zu aktualisieren, während ci seinen Inhalt verwendet. Nur mit erhalten npm 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 Ihrer package.json
oder einigen Ihrer Abhängigkeiten diese verwenden, aber wie können Sie sicherstellen, dass jedes Mal npm 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 erfolgt npm ci
(der aus der Sperrdatei liest und den gesamten Paketbaum installiert).
package-lock.json
Datei. Es wird einfach so installiert, package.json
wie es früher war. Um die package-lock.json
Datei nutzen zu können, müssen Sie den neuen Befehl "npm ci" verwenden, mit dem die genauen Versionen installiert werden, die in package-lock.json
anstelle der angegebenen Versionsbereiche aufgeführt sind package.json
.
npm install
nicht lesen aus package-lock.json
. Gehen Sie zum Reproduzieren wie folgt vor. mit dieser package.json, laufen npm install
{... "devDependencies": { "Sinon": "7.2.2"}} Jetzt kopieren / einfügen package.json
und package-lock.json
in ein neues Verzeichnis. Wechseln Sie package.json
zu: "sinon": "^ 7.2.2" run npm 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öschen package-lock.json
und neu zu generieren npm install
. (Sie möchten nicht manuell bearbeiten package-lock.json
). Wenn Sie den Wert der "version" -Eigenschaft (oben) package.json
ändern, ändert sich das gleiche in package-lock.json
on npm install
, aber das Hinzufügen eines Carets zu einer Abhängigkeit bewirkt nicht dasselbe package-lock.json
.
package.json
Sie sich etwas vor, das Sie manuell ändern können, und package-lock.json
etwas, das Sie niemals manuell berühren. Sie kontrollieren immer BEIDE Dateien - insbesondere package-lock.json
. Öffnen Sie beide Dateien, bearbeiten Sie den Projektnamen manuell package.json
, führen Sie ihn aus npm install
und beobachten Sie, wie sich der Projektname ändert package-lock.json
. license
scheint nicht aufgenommen zu sein package-lock.json
.
npm ci
, npm install
wird nur package.json verwenden, auch wenn die Lock - Datei zur Verfügung gestellt wird
package-lock.json
wird geschrieben, wenn ein numerischer Wert in einer Eigenschaft wie der Eigenschaft "version" oder eine Abhängigkeitseigenschaft in geändert wird package.json
.
Wenn diese Zahlenwerte übereinstimmen package.json
und package-lock.json
übereinstimmen, package-lock.json
wird aus gelesen.
Wenn diese numerischen Werte in package.json
und package-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öst package-lock.json
.
Um zu sehen, was ich meine, gehen Sie wie folgt vor. Verwenden Sie package.json
ohne package-lock.json
, führen Sie npm install
mit:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "7.2.2"
}
}
package-lock.json
wird jetzt haben:
"sinon": {
"version": "7.2.2",
Kopieren Sie nun beide Dateien in ein neues Verzeichnis. Wechseln package.json
zu (nur Caret hinzufügen):
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.2.2"
}
}
laufen npm install
. Wenn es keine package-lock.json
Datei gäbe, würde sinon@7.3.0 installiert. npm install
ist das Lesen aus package-lock.json
und 7.2.2 installieren.
Wechseln Sie nun package.json
zu:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.3.0"
}
}
laufen npm install
. package-lock.json
wurde an geschrieben und wird nun zeigen:
"sinon": {
"version": "^7.3.0",
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.
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.
{
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
"integrity": "sha512-2zi6S9tPlk52vyqNFg==",
"dev": true,
"requires": {
"@angular-devkit/core": "7.1.4",
"rxjs": "6.3.3"
}
},
}}
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.
package-lock.json: Enthält die genauen Versionsdetails, die derzeit für Ihre Anwendung installiert sind.