Sie haben wahrscheinlich so etwas wie:
"typescript":"~2.1.6"
In package.json
Ihrem Fall wird npm auf die neueste Nebenversion aktualisiert2.4.1
Bearbeiten: Frage von OP
Das erklärt aber nicht, warum "npm install" die Sperrdatei ändern würde. Ist die Sperrdatei nicht dazu gedacht, einen reproduzierbaren Build zu erstellen? In diesem Fall sollte unabhängig vom Semver-Wert dieselbe Version 2.1.6 verwendet werden.
Antworten:
Dies soll Ihren vollständigen Abhängigkeitsbaum sperren. Sagen wir typescript v2.4.1
erfordert widget ~v1.0.0
. Wenn Sie npm installieren, greift es widget v1.0.0
. Später führt Ihr Entwicklerkollege (oder CI-Build) eine npm-Installation durch und erhält diese typescript v2.4.1
, widget
wurde jedoch aktualisiert widget v1.0.1
. Jetzt ist Ihr Knotenmodul nicht mehr synchron. Das ist waspackage-lock.json
verhindert.
Oder allgemeiner:
Betrachten Sie als Beispiel
Paket A:
{"name": "A", "version": "0.1.0", "dependencies": {"B": "<0.1.0"}}
Paket B:
{"Name": "B", "Version": "0.0.1", "Abhängigkeiten": {"C": "<0.1.0"}}
und Paket C:
{"name": "C", "version": "0.0.1"}
Wenn dies die einzigen Versionen von A, B und C sind, die in der Registrierung verfügbar sind, wird eine normale npm-Installation A installiert:
A@0.1.0 - B@0.0.1 - C@0.0.1
Wenn jedoch B@0.0.2 veröffentlicht wird, wird eine neue npm-Installation A installiert:
A@0.1.0 - B@0.0.2 - C@0.0.1 unter der Annahme, dass die neue Version die Abhängigkeiten von B nicht geändert hat. Natürlich könnte die neue Version von B eine neue Version von C und eine beliebige Anzahl neuer Abhängigkeiten enthalten. Wenn solche Änderungen unerwünscht sind, kann der Autor von A eine Abhängigkeit von B@0.0.1 angeben. Wenn jedoch der Autor von A und der Autor von B nicht dieselbe Person sind, kann der Autor von A nicht sagen, dass er oder sie keine neu veröffentlichten Versionen von C abrufen möchte, wenn sich B überhaupt nicht geändert hat.
OP Frage 2: Lassen Sie mich sehen, ob ich richtig verstehe. Sie sagen, dass die Sperrdatei die Versionen der sekundären Abhängigkeiten angibt, sich jedoch weiterhin auf den Fuzzy-Abgleich von package.json stützt, um die Abhängigkeiten der obersten Ebene zu bestimmen. Ist das richtig?
Antwort: Nein. Package-Lock sperrt den gesamten Paketbaum, einschließlich der in beschriebenen Root-Pakete package.json
. Wenn in Ihrem typescript
gesperrt ist , sollte dies so bleiben, bis es geändert wird. Und sagen wir, morgen wird die Version veröffentlicht . Wenn ich Ihren Zweig auschecke und ausführe , respektiert npm die Sperrdatei und installiert sie .2.4.1
package-lock.json
typescript
2.4.2
npm install
2.4.1
Mehr zu package-lock.json
:
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.
Optimieren Sie den Installationsprozess, indem Sie npm erlauben, wiederholte Metadatenauflösungen für zuvor installierte Pakete zu überspringen.
https://docs.npmjs.com/files/package-lock.json