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 install
die 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 install
Befehl 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?
quelle
package-lock.json
wird regeneriert, wenn ich rennenpm install
. Das riecht nach einem npm-Bug. Verwenden Sie Ihre eigene Registrierung?--no-save
verhindert das Ändern der Sperrdatei, hat jedoch keine Auswirkungen auf die doofe Abhängigkeitsaktualisierung der ersten Ebene, die im OP erwähnt wird.Antworten:
Update 3: Wie auch andere Antworten zeigen, wurde der
npm ci
Befehl 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.json
wurde 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.json
dies überschrieben werden kann,package-lock.json
wenn eine neuere Version für eine Abhängigkeit in gefunden wirdpackage.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 sie1.2.0
anstelle von~1.2.0
oder schreiben^1.2.0
. Dann ergibt die Kombination vonpackage.json
undpackage-lock.json
reproduzierbare Builds. Um es klar auszudrücken:package-lock.json
Allein 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
lock
nicht 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 .
quelle
npm update
dann? : o Ich hatte das gleiche Gefühl wienpm install
aktualisierte Deps, aber ich möchte es nicht glauben. Aber es scheint leider wahr zu sein.npm shrinkwrap
Auf 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 ..Ich habe , dass es fand eine neue Version von npm sein 5.7.1 mit dem neuen Befehl
npm ci
, die aus installierenpackage-lock.json
nurquelle
npm install
", bevor Sie den Befehlnpm ci
in diesem Projekt ausführen. Nichtnpm install
die Paket-lock.json Datei überschreiben?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 sagenthatpackage: 1
, und Sperren sagt..: 1.0.4
, kann dev bearbeiten, um zu sagenthatpackage: 2
- und das zwingt dazu, dass sich die Sperrdatei ändert, da sie1.0.4
nicht mit dem neu angegebenen Bereich kompatibel ist. Wenn Sie dies nicht ändernpackages.json
, bleibt die genaue Version gesperrt, bis die Sperrdatei gelöscht wird. [Wenn nicht bleiben nicht gesperrt, und nicht packages.json ändern, einen Fehlerbericht.]Verwenden Sie die neu eingeführte
Einführung
npm ci
für schnellere und zuverlässigere Buildsquelle
npm ci
, und nur verwenden ,npm install
wenn die Aktualisierung oder der Installation neuer Pakete.node_modules
Verzeichnis gelöscht und lokal neu erstellt wird, auch wenn dies ein ansonsten leerer, aber wichtiger Symlink ist. :(npm ci
Ich 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.Kurze Antwort:
npm install
ehrt package-lock.json nur, wenn es die Anforderungen von package.json erfüllt.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:
Dann tun Sie dies,
npm install
wodurch eine package-lock.json generiert wird mit:Wenige Tage später wird eine neuere Nebenversion von "depA" veröffentlicht, beispielsweise "1.1.0". Dann gilt Folgendes:
Als Nächstes aktualisieren Sie Ihre package.json manuell auf:
Führen Sie dann erneut aus:
quelle
npm install
verwendet die gesperrten Versionen von, espackage-lock.json
sei denn, es erfüllt nicht diepackage.json
Anforderungen. In diesem Fall wird package.json installiert und package-lock.json entsprechend neu erstellt. Wenn Sie Ihrepackage.json
so geändert haben , dass die vorhandene Paketsperre immer noch den aktualisierten Anforderungen entsprichtpackage.json
, wird diese weiterhin verwendetpackage-lock
npm install
erfü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.node_modules
den Bereich in erfülltpackage.json
und keinepackage-lock.json
Datei vorhanden ist , aktualisiert npm das Modul beim Ausführen nichtnpm install
. Ich denke, es ist in Ordnung, da Sie Abhängigkeiten verwenden könnennpm update
(odernpm-check
für die neueste Version), und dieses Verhalten ist schneller, wenn jemand nur einen Eintrag hinzufügtpackage.json
und nicht möchte, dass sich nicht verwandte Pakete auf die neueste Version aktualisieren, die dem Semver entspricht Angebot.Verwenden Sie den
npm ci
Befehl anstelle vonnpm 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
quelle
ci
bezieht 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/…node_modules
Ordner und erstellt ihn von Grund auf neu. Ist es wirklich viel schneller? Istnpm install
Löschnode_modules
Ordner auch?npm install
sich vor, Sie müssen beim Ausführen alle Paketabhängigkeiten auflösen.npm ci
ist nur eine Einkaufsliste von "genau diese Module erhalten".In Zukunft können Sie ein
--from-lock-file
(oder ein ähnliches) Flag verwenden, um nur von zu installieren,package-lock.json
ohne 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 .
quelle
npm ci
auch Ihre Frage behandelt.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.quelle
npm i
. Zum Beispiel wird das Modulfsevents
entfernt, wenn ichnpm i
auf einem Computer bin , der dies nicht unterstützt,fsevents
und dann wird das Modul erneut hinzugefügt, wenn esnpm i
erneut auf einem Computer ausgeführt wird, der dies unterstützt.fsevents
Tropfen in meinempackage-lock.json
mit ,[email protected]
während sie mit Mac OS X Mitwirkenden zusammen. Wenn Sie keine Ausgabe geöffnet haben, werde ich.Sie haben wahrscheinlich so etwas wie:
In
package.json
Ihrem Fall wird npm auf die neueste Nebenversion aktualisiert2.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:
https://docs.npmjs.com/files/package-lock.json
quelle
package-lock.json
heruntergezogen und dann ausgeführtnpm install
, aber diepackage-lock.json
Datei wird geändert und wir müssen einen Reset durchführen, bevor wir die nächsten Änderungen abrufen können.Wahrscheinlich sollten Sie so etwas verwenden
Anstatt zu verwenden
npm install
wenn Sie die Version Ihres Pakets nicht ändern möchten.Befolgen Sie gemäß der offiziellen Dokumentation beide
npm install
undnpm ci
installieren Sie die Abhängigkeiten, die für das Projekt benötigt werden.quelle
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.
quelle
EDIT: Der Name "Lock" ist schwierig, sein NPM versucht, Yarn einzuholen. Es ist überhaupt keine gesperrte Datei.
package.json
ist eine vom Benutzer festgelegte Datei, die nach der "Installation" den Ordnerbaum "node_modules" generiert und in diesen Baum geschrieben wirdpackage-lock.json
. Sie sehen, es ist umgekehrt - Abhängigkeitsversionen werdenpackage.json
wie immerpackage-lock.json
abgerufen und sollten aufgerufen werdenpackage-tree.json
(Ich hoffe, dies hat meine Antwort nach so vielen Abstimmungen klarer gemacht.)
Eine vereinfachende Antwort:
package.json
Haben Sie Ihre Abhängigkeiten wie gewohnt, währendpackage-lock.json
es 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.
quelle