Welche Rolle spielt die package-lock.json?

290

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.

SecretCastle
quelle

Antworten:

289

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. "

Bearbeiten

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.

Matt
quelle
78
Wenn Sie nach einer genauen Version von Abhängigkeiten suchen, können Sie die genaue Version in package.json erzwingen und auf eine package-lock.json-Datei verzichten.
Jrahhali
15
@jrahhali - habe meine Antwort basierend auf Ihrer Frage geändert.
Matt
1
Wie wird dieser Abhängigkeitsbaum von pacakge.json.lock auf andere Entwickler angewendet? Automatisch?
Stevek
40
Bitte beachten Sie, dass diese Antwort nicht mehr korrekt ist ! Die package-lock.jsonDatei 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.3statt 1.2.*in Ihrer package.jsonDatei.
Christian
5
Sie sollten einen Verweis auf npm cias hinzufügen, npm installum die package-lock.json zu aktualisieren, während ci seinen Inhalt verwendet. Nur mit erhalten npm ciSie wiederholbare robuste Builds.
k0pernikus
34

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.3in Ihrer package.jsonoder einigen Ihrer Abhängigkeiten diese verwenden, aber wie können Sie sicherstellen, dass jedes Mal npm installdieselbe Version auf Ihrem Entwicklungscomputer und auf dem Build-Server abgerufen wird? package-lock.json wird dies sicherstellen.

npm installgeneriert 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).

Xin
quelle
9
Beachten Sie, dass dies jetzt etwas veraltet ist. Ab 5.1.0 liest "npm install" überhaupt nicht mehr aus der package-lock.jsonDatei. Es wird einfach so installiert, package.jsonwie es früher war. Um die package-lock.jsonDatei nutzen zu können, müssen Sie den neuen Befehl "npm ci" verwenden, mit dem die genauen Versionen installiert werden, die in package-lock.jsonanstelle der angegebenen Versionsbereiche aufgeführt sind package.json.
Venryx
5
Ich fürchte, Venryx ist falsch. 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.jsonund package-lock.jsonin ein neues Verzeichnis. Wechseln Sie package.jsonzu: "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.
Zumafra
2
Und nicht nur das, aber wenn Sie so etwas wie das Caret ^ hinzufügen möchten package-lock.json, ist der einzig vernünftige Weg, dies zu löschen package-lock.jsonund 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.jsonon npm install, aber das Hinzufügen eines Carets zu einer Abhängigkeit bewirkt nicht dasselbe package-lock.json.
Zumafra
1
Stellen package.jsonSie sich etwas vor, das Sie manuell ändern können, und package-lock.jsonetwas, 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 installund beobachten Sie, wie sich der Projektname ändert package-lock.json. licensescheint nicht aufgenommen zu sein package-lock.json.
Zumafra
2
@zumafra Paket-lock.json Datei verwenden, wenn tun npm ci, npm installwird nur package.json verwenden, auch wenn die Lock - Datei zur Verfügung gestellt wird
Xin
13

package-lock.jsonwird 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.jsonund package-lock.jsonübereinstimmen, package-lock.jsonwird aus gelesen.

Wenn diese numerischen Werte in package.jsonund package-lock.jsonnicht übereinstimmen, package-lock.jsonwird 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.jsonohne package-lock.json, führen Sie npm installmit:

{
  "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.jsonzu (nur Caret hinzufügen):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

laufen npm install. Wenn es keine package-lock.jsonDatei gäbe, würde [email protected] installiert. npm installist das Lesen aus package-lock.json und 7.2.2 installieren.

Wechseln Sie nun package.jsonzu:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

laufen npm install. package-lock.jsonwurde an geschrieben und wird nun zeigen:

"sinon": {
  "version": "^7.3.0",
zumafra
quelle
7

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.

nflaig
quelle
4

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"
  }
},

}}

DIBYA RANJAN TRIPATHY
quelle
2

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.

user_ahmed
quelle
1
Was passiert also, wenn ich einen Konflikt mit dieser Datei bekomme?
Oliver Watkins
0

package-lock.json: Enthält die genauen Versionsdetails, die derzeit für Ihre Anwendung installiert sind.

Shubham Srivastava
quelle
1
Hallo und willkommen. Diese Frage wurde bereits beantwortet. Sie müssen überprüfen, ob die Frage als beantwortet markiert wurde, um festzustellen, ob eine der Antworten einen grünen Haken enthält.
Néstor