Warum schreibt "npm install" package-lock.json neu?

613

Ich habe kürzlich ein Upgrade auf npm @ 5 durchgeführt . Ich habe jetzt eine package-lock.json- Datei mit allem von package.json . Ich würde erwarten, dass beim Ausführen npm installdie Abhängigkeitsversionen aus der Sperrdatei abgerufen werden, um zu bestimmen, was in meinem Verzeichnis node_modules installiert werden soll . Was seltsam ist, ist, dass es tatsächlich dazu führt, dass meine package-lock.json- Datei geändert und neu geschrieben wird.

Für die Sperrdatei wurde beispielsweise Typoskript in Version 2.1.6 angegeben . Nach dem npm installBefehl wurde die Version in 2.4.1 geändert . Das scheint den ganzen Zweck einer Sperrdatei zu zunichte zu machen.

Was vermisse ich? Wie kann ich npm dazu bringen, meine Sperrdatei tatsächlich zu respektieren?

Viper Bailey
quelle
4
Dies beantwortet Ihre Frage nicht. Hoffentlich ist ein Kommentar in Ordnung, aber schauen Sie sich Yarn an. Der Wechsel dauerte für uns weniger als eine Stunde.
KayakinKoder
4
Das gleiche Problem, aber mit Garn github.com/yarnpkg/yarn/issues/570 (sehr lehrreich)
Yves M.
2
Ich habe das gleiche Problem. Mein package-lock.jsonwird regeneriert, wenn ich renne npm install. Das riecht nach einem npm-Bug. Verwenden Sie Ihre eigene Registrierung?
HaNdTriX
@ YvesM. --no-saveverhindert das Ändern der Sperrdatei, hat jedoch keine Auswirkungen auf die doofe Abhängigkeitsaktualisierung der ersten Ebene, die im OP erwähnt wird.
Ross Allen

Antworten:

423

Update 3: Wie auch andere Antworten zeigen, wurde der npm ciBefehl in npm 5.7.0 eingeführt, um schnelle und reproduzierbare Builds im CI-Kontext zu erzielen. Weitere Informationen finden Sie in der Dokumentation und im npm-Blog .


Update 2: Das Problem zum Aktualisieren und Verdeutlichen der Dokumentation ist das GitHub-Problem Nr. 18103 .


Update 1: Das unten beschriebene Verhalten wurde in npm 5.4.2 behoben: Das derzeit beabsichtigte Verhalten wird in GitHub-Problem Nr. 17979 beschrieben .


Ursprüngliche Antwort: Das Verhalten von package-lock.jsonwurde in npm 5.1.0 geändert, wie in Ausgabe 16866 beschrieben . Das von Ihnen beobachtete Verhalten ist anscheinend von npm ab Version 5.1.0 beabsichtigt.

Das bedeutet, dass package.jsondies überschrieben werden kann, package-lock.jsonwenn eine neuere Version für eine Abhängigkeit in gefunden wird package.json. Wenn Sie Ihre Abhängigkeiten effektiv anheften möchten, müssen Sie jetzt die Versionen ohne Präfix angeben, z. B. müssen Sie sie 1.2.0anstelle von ~1.2.0oder schreiben ^1.2.0. Dann ergibt die Kombination von package.jsonund package-lock.jsonreproduzierbare Builds. Um es klar auszudrücken: package-lock.jsonAllein sperrt die Abhängigkeiten auf Stammebene nicht mehr!

Ob diese Entwurfsentscheidung gut war oder nicht, ist fraglich. Aufgrund dieser Verwirrung über GitHub in Ausgabe 17979 wird derzeit diskutiert . (In meinen Augen ist es eine fragwürdige Entscheidung; zumindest gilt der Name locknicht mehr.)

Noch eine Randnotiz: Es gibt auch eine Einschränkung für Registries, die unveränderliche Pakete nicht unterstützen, z. B. wenn Sie Pakete direkt von GitHub anstelle von npmjs.org abrufen. Weitere Erläuterungen finden Sie in dieser Dokumentation zu Paketsperren .

Jotaen
quelle
43
Wofür ist der Hack npm updatedann? : o Ich hatte das gleiche Gefühl wie npm installaktualisierte Deps, aber ich möchte es nicht glauben. Aber es scheint leider wahr zu sein. npm shrinkwrapAuf jeden Fall gibt es immer noch die Möglichkeit, Deps zu sperren, aber der Name Package-Lock ist definitiv falsch da es weder einfriert noch Abhängigkeiten sperrt ..
Jurosh
266
Was für ein Chaos! Der weltweit größte Paketmanager hat noch keine Dokumentation darüber, wie es funktionieren soll. Jeder ahnt, was es tun soll und es wird zu einem Meinungskrieg. Die Diskussion ist gut, sollte aber vor einer Veröffentlichung in der Wildnis stattfinden. Irgendwann muss jemand den letzten Anruf tätigen und kann dann implementiert, dokumentiert und freigegeben werden. PHP wurde vom Komitee entworfen und ad-hoc zusammen und schauen, wie es sich herausstellte. Ich würde es hassen, wenn einem so kritischen und weit verbreiteten Tool dasselbe passiert.
Landon Poch
85
Was bringt es dann, die Paketsperre zu verwenden? Ich dachte, es würde die gleiche Umgebung in verschiedenen Arbeitsbereichen schaffen, aber es stellte sich heraus, dass es nichts tut
am
17
"Dann ergibt die Kombination von package.json und package-lock.json reproduzierbare Builds." Welche Rolle spielt "package-lock.json" hier? Ergibt "package.json" nicht schon reproduzierbare Builds, wenn keine Versionspräfixe verwendet werden?
Jānis Elmeris
12
@ JānisElmeris Ich denke, package.json kann tiefe Abhängigkeiten nicht sperren ...
Juan Mendes
165

Ich habe , dass es fand eine neue Version von npm sein 5.7.1 mit dem neuen Befehl npm ci, die aus installieren package-lock.jsonnur

Der neue Befehl npm ci wird NUR von Ihrer Sperrdatei installiert. Wenn Ihre package.json und Ihre Sperrdatei nicht synchron sind, wird ein Fehler gemeldet.

Es funktioniert, indem Sie Ihre node_modules wegwerfen und von Grund auf neu erstellen.

Abgesehen davon, dass Sie nur das erhalten, was sich in Ihrer Sperrdatei befindet, ist es auch viel schneller (2x-10x!) Als die npm-Installation, wenn Sie nicht mit einem node_modules beginnen.

Wie Sie dem Namen entnehmen können, erwarten wir, dass dies ein großer Segen für Umgebungen mit kontinuierlicher Integration ist. Wir erwarten auch, dass Leute, die Produktionsbereitstellungen von Git-Tags durchführen, große Gewinne erzielen werden.

Ivan Shcherbakov
quelle
133
Dies sollte das Standardverhalten sein, wenn eine Sperrdatei vorhanden ist.
Nichtigkeit
13
Also haben sie geändert, wie npm ich arbeite, nur um es als npm ci Monate später wieder einzubringen?
Scott Flack
1
Ich bin immer noch verwirrt. In den Dokumentationen heißt es: "Stellen Sie sicher, dass Sie über eine Paketsperre und eine aktuelle Installation verfügen: npm install", bevor Sie den Befehl npm ciin diesem Projekt ausführen. Nicht npm installdie Paket-lock.json Datei überschreiben?
Adiga
1
AFAIK: @adiga - Ab Version 5.4 wird die Sperrdatei npm nur dann geändert, wenn dies erforderlich ist, um die Spezifikation in packages.json zu erfüllen . Wenn also Pakete verwendet werden, um zu sagen thatpackage: 1, und Sperren sagt ..: 1.0.4, kann dev bearbeiten, um zu sagen thatpackage: 2- und das zwingt dazu, dass sich die Sperrdatei ändert, da sie 1.0.4nicht mit dem neu angegebenen Bereich kompatibel ist. Wenn Sie dies nicht ändern packages.json, bleibt die genaue Version gesperrt, bis die Sperrdatei gelöscht wird. [Wenn nicht bleiben nicht gesperrt, und nicht packages.json ändern, einen Fehlerbericht.]
ToolmakerSteve
1
@ George Aus den Informationen, die ich gelesen habe (für aktuelle Versionen von npm), und meinen eingeschränkten Tests: Ja zu beiden.
Venryx
95

Verwenden Sie die neu eingeführte

npm ci

npm ci verspricht großen Teams den größten Nutzen. Wenn Entwickler die Möglichkeit erhalten, sich von einer Paketsperre abzumelden, wird die Zusammenarbeit zwischen großen Teams effizienter, und durch die Möglichkeit, genau das zu installieren, was sich in einer Sperrdatei befindet, können zehn, wenn nicht Hunderte von Entwicklerstunden pro Monat eingespart werden, wodurch Teams frei werden um mehr Zeit damit zu verbringen, erstaunliche Dinge zu bauen und zu versenden.

Einführung npm cifür schnellere und zuverlässigere Builds

Gal Margalit
quelle
3
das scheint mir richtig zu sein? kann jemand anderes bestätigen?
Telefon512
6
@ phouse512 Das ist richtig. Wir ziemlich viel nur verwenden npm ci, und nur verwenden , npm installwenn die Aktualisierung oder der Installation neuer Pakete.
Jacob Sievers
1
Aktuelle Kommentare usw. Dies ist die Antwort, mit der ich gehe. Schade, dass sie das schreckliche Snafu nicht reparieren konnten, aber wenn das neue Evangelium "npm ci" ist, dann gut. Ich kann mich anpassen.
Svend
Schade, dass immer ein vorhandenes node_modulesVerzeichnis gelöscht und lokal neu erstellt wird, auch wenn dies ein ansonsten leerer, aber wichtiger Symlink ist. :(
Joe Atzberger
2
@ToolmakerSteve Halten Sie nicht den Atem an! Ich denke, das Löschen des Inhalts eines Verzeichnisses wäre um Größenordnungen langsamer als das Löschen des Verzeichnisses. Sie müssten den Inhalt aufzählen und dann eine Reihe von Löschbefehlen ausgeben und nicht nur den einen Löschbefehl an das Betriebssystem. Angesichts der Leistungsprobleme, die zuvor bei npm aufgetreten waren, und der Verbesserung durch die Verwendung von npm ciIch gehe davon aus, dass sie nur sehr ungern etwas einführen würden, das die Leistung für einen eher ungewöhnlichen Anwendungsfall verringern könnte. Vielleicht möchten Sie pnpm.js.org besuchen, obwohl dies harte Links verwendet, um die Festplattennutzung zu reduzieren.
Caltor
64

Kurze Antwort:

  • npm install ehrt package-lock.json nur, wenn es die Anforderungen von package.json erfüllt.
  • Wenn diese Anforderungen nicht erfüllt werden, werden die Pakete aktualisiert und die Paketsperre überschrieben.
  • Wenn Sie den Build lieber nicht bestehen, als in diesem Fall die Paketsperre neu zu schreiben, verwenden Sie npm ci.

Hier ist ein Szenario, das die Dinge erklären könnte (Verifiziert mit NPM 6.3.0).

Sie deklarieren eine Abhängigkeit in package.json wie folgt:

"depA": "^1.0.0"

Dann tun Sie dies, npm installwodurch eine package-lock.json generiert wird mit:

"depA": "1.0.0"

Wenige Tage später wird eine neuere Nebenversion von "depA" veröffentlicht, beispielsweise "1.1.0". Dann gilt Folgendes:

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed 
             # (i.e. when package-lock.json exists, it overrules package.json)

Als Nächstes aktualisieren Sie Ihre package.json manuell auf:

"depA": "^1.1.0"

Führen Sie dann erneut aus:

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0" 
            # so it would throw an error 

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)
Ahmad Abdelghany
quelle
4
Dies ist in der Tat das beabsichtigte Verhalten einer "Sperr" -Datei. Anscheinend war dies bei älteren NPM-Versionen nicht der Fall.
Blockost
1
Wie verfolgt npm dann das letzte Update von package.json? Was passiert, wenn Sie package.json und package-lock.json auf einen anderen Computer verschieben? Woher weiß npm auf einem neuen Computer, ob package.lock das Original ist oder aktualisiert wurde, um zu entscheiden, ob package-lock.json aktualisiert werden muss oder nicht?
Lahiru Chandima
3
@LahiruChandima Es werden Updates nicht wirklich verfolgt. npm installverwendet die gesperrten Versionen von, es package-lock.jsonsei denn, es erfüllt nicht die package.jsonAnforderungen. In diesem Fall wird package.json installiert und package-lock.json entsprechend neu erstellt. Wenn Sie Ihre package.jsonso geändert haben , dass die vorhandene Paketsperre immer noch den aktualisierten Anforderungen entspricht package.json, wird diese weiterhin verwendetpackage-lock
Ahmad Abdelghany
1
Wenn Sie bereits ein Modul in node_modules haben, das die Anforderungen von package.json npm installerfüllt, wird unabhängig von package-lock.json nichts unternommen. Wir müssen Pakete explizit aktualisieren, auch wenn Updates verfügbar sind, die dem in package.json angegebenen Semver entsprechen. Zumindest ist das seit Jahren meine Erfahrung.
carlin.scott
1
@ToolmakerSteve Ich war auch skeptisch gegenüber dem Verhalten, das @ carlin.scott gemeldet hat, aber ich habe es gerade getestet, und tatsächlich hat er Recht. Wenn die Version innerhalb node_modulesden Bereich in erfüllt package.jsonund keine package-lock.jsonDatei vorhanden ist , aktualisiert npm das Modul beim Ausführen nicht npm install. Ich denke, es ist in Ordnung, da Sie Abhängigkeiten verwenden können npm update(oder npm-checkfür die neueste Version), und dieses Verhalten ist schneller, wenn jemand nur einen Eintrag hinzufügt package.jsonund nicht möchte, dass sich nicht verwandte Pakete auf die neueste Version aktualisieren, die dem Semver entspricht Angebot.
Venryx
19

Verwenden Sie den npm ciBefehl anstelle von npm install.

"ci" steht für "kontinuierliche Integration".

Es werden die Projektabhängigkeiten basierend auf der Datei package-lock.json anstelle der milden Abhängigkeiten der Datei package.json installiert.

Es werden identische Builds für Ihre Teamkollegen erstellt und es ist auch viel schneller.

Sie können mehr darüber in diesem Blog-Beitrag lesen: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

Daniel Tonon
quelle
2
cibezieht sich auf "kontinuierliche Integration", wie in den Dokumenten und im Blog-Beitrag erwähnt, in denen der Befehl angekündigt wird: blog.npmjs.org/post/171556855892/…
Joe Atzberger
Danke Joe. Ich habe meine Antwort mit dem richtigen Namen aktualisiert und mit dem Blog-Beitrag verlinkt. 😊 (für diejenigen, die dies lesen, zuvor habe ich gesagt, dass es für "Clean Install" steht)
Daniel Tonon
"Und es ist auch viel schneller" - es löscht node_modulesOrdner und erstellt ihn von Grund auf neu. Ist es wirklich viel schneller? Ist npm installLösch node_modulesOrdner auch?
izogfif
Ich denke, die Geschwindigkeit kommt von npm, ohne berechnen zu müssen, welche Pakete heruntergeladen werden sollen. Stellen Sie npm installsich vor, Sie müssen beim Ausführen alle Paketabhängigkeiten auflösen. npm ciist nur eine Einkaufsliste von "genau diese Module erhalten".
Daniel Tonon
8

In Zukunft können Sie ein --from-lock-file(oder ein ähnliches) Flag verwenden, um nur von zu installieren, package-lock.jsonohne es zu ändern.

Dies ist nützlich für CI-Umgebungen usw., in denen reproduzierbare Builds wichtig sind.

Sehen Informationen zur Verfolgung der Funktion finden https://github.com/npm/npm/issues/18286 .

Timothy Higinbottom
quelle
Ich bezweifle das. Wie können Sie die Installation erzwingen, wenn die Abhängigkeiten für verschiedene Betriebssysteme unterschiedlich sind?
Jewgenij Afanasjew
4
@YevgeniyAfanasyev Anstelle dieses Flags wurde es so implementiert, dass es npm ciauch Ihre Frage behandelt.
Spex
8

Es scheint, dass dieses Problem in npm v5.4.2 behoben ist

https://github.com/npm/npm/issues/17979

(Scrolle nach unten zum letzten Kommentar im Thread)

Aktualisieren

Eigentlich in 5.6.0 behoben. In 5.4.2 gab es einen plattformübergreifenden Fehler, der dazu führte, dass das Problem weiterhin auftrat.

https://github.com/npm/npm/issues/18712

Update 2

Siehe meine Antwort hier: https://stackoverflow.com/a/53680257/1611058

npm ci ist der Befehl, den Sie verwenden sollten, wenn Sie jetzt vorhandene Projekte installieren.

Daniel Tonon
quelle
5
Ich verwende 5.4.2 und es führt immer noch zur Änderung meiner package-lock.json, wenn npm i. Zum Beispiel wird das Modul fseventsentfernt, wenn ich npm iauf einem Computer bin , der dies nicht unterstützt, fseventsund dann wird das Modul erneut hinzugefügt, wenn es npm ierneut auf einem Computer ausgeführt wird, der dies unterstützt.
hrdwdmrbl
Dann sollten Sie ein neues Problem im npm GitHub-Repo ansprechen, das dies erklärt. Wenn es nicht so funktioniert, wie sie sagen, dass es funktionieren soll, sehen sie es als einen Fehler mit hoher Priorität an, der dringend behoben werden muss.
Daniel Tonon
@hrdwdmrbl Ich sehe die gleiche fseventsTropfen in meinem package-lock.jsonmit , [email protected]während sie mit Mac OS X Mitwirkenden zusammen. Wenn Sie keine Ausgabe geöffnet haben, werde ich.
AL der X
@hrdwdmrbl Ich fand das (und den langen Thread der damit verbundenen Probleme), nachdem ich meinen Kommentar hinterlassen und vergessen hatte, zu SO zurückzukehren, um meinen Kommentar zu aktualisieren. Danke, dass du meinen Rücken bekommen hast. Alles ist gut.
AL der X
4

Sie haben wahrscheinlich so etwas wie:

"typescript":"~2.1.6"

In package.jsonIhrem 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.1erfordert 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, widgetwurde 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:

[email protected] - [email protected] - [email protected]

Wenn jedoch [email protected] veröffentlicht wird, wird eine neue npm-Installation A installiert:

[email protected] - [email protected] - [email protected] 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 [email protected] 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 typescriptgesperrt 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.1package-lock.jsontypescript2.4.2npm install2.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

Matt
quelle
29
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.
Viper Bailey
3
Und das ist das, was ich sage. In meiner Paketsperrdatei steht [email protected], aber wenn ich npm install ausführe, wird der Eintrag durch [email protected] ersetzt.
Viper Bailey
5
Ich habe das gleiche Problem erlebt. In unserer CI / CD wird das package-lock.jsonheruntergezogen und dann ausgeführt npm install, aber die package-lock.jsonDatei wird geändert und wir müssen einen Reset durchführen, bevor wir die nächsten Änderungen abrufen können.
BayssMekanique
15
Ich verstehe es nicht Wie ist dies eine "Sperr" -Datei, wenn nachfolgende Installationen möglicherweise noch Upgrades durchführen?!
Ross Allen
5
Ich denke, sie begannen mit der Idee, diese Datei als "info" und "lock" zu haben, und entschieden dann, dass es sich nur um eine "info" -Datei handelt. Besserer Name wäre "package-info.json". Ich würde gerne ein "npm install -lock" haben, das von "package-lock.json" installiert wird und "package.json" ignoriert
Jeremy Chone
2

Wahrscheinlich sollten Sie so etwas verwenden

npm ci

Anstatt zu verwenden npm install wenn Sie die Version Ihres Pakets nicht ändern möchten.

Befolgen Sie gemäß der offiziellen Dokumentation beide npm installund npm ciinstallieren Sie die Abhängigkeiten, die für das Projekt benötigt werden.

Der Hauptunterschied besteht darin, npm installdie Pakete packge.jsonals Referenz zu installieren . In diesem Fall werden npm cidie Pakete package-lock.jsonals Referenz installiert , wobei jedes Mal sichergestellt wird, dass das genaue Paket installiert wird.

Sengottaian Karthik
quelle
1

Es gibt ein offenes Problem dafür auf ihrer Github-Seite: https://github.com/npm/npm/issues/18712

Dieses Problem ist am schwerwiegendsten, wenn Entwickler unterschiedliche Betriebssysteme verwenden.

hrdwdmrbl
quelle
Die Umschreibungen in Package-Lock sind beabsichtigt, das Problem ist keine Folge davon
Z. Khullah
0

EDIT: Der Name "Lock" ist schwierig, sein NPM versucht, Yarn einzuholen. Es ist überhaupt keine gesperrte Datei. package.jsonist eine vom Benutzer festgelegte Datei, die nach der "Installation" den Ordnerbaum "node_modules" generiert und in diesen Baum geschrieben wird package-lock.json. Sie sehen, es ist umgekehrt - Abhängigkeitsversionen werden package.jsonwie immer package-lock.jsonabgerufen und sollten aufgerufen werdenpackage-tree.json

(Ich hoffe, dies hat meine Antwort nach so vielen Abstimmungen klarer gemacht.)


Eine vereinfachende Antwort: package.jsonHaben Sie Ihre Abhängigkeiten wie gewohnt, während package-lock.jsones sich um einen "exakten und vor allem reproduzierbaren node_modules-Baum" handelt (entnommen aus npm docs selbst ).

Was den kniffligen Namen betrifft, so versucht sein NPM, Yarn einzuholen.

Z. Khullah
quelle
1
Denn wenn Sie npm install ausführen, wird die Paketsperre aktualisiert.
Jean-Baptiste