npm 5 wurde heute veröffentlicht und eine der neuen Funktionen umfasst deterministische Installationen mit der Erstellung einer package-lock.json
Datei.
Soll diese Datei in der Quellcodeverwaltung aufbewahrt werden?
Ich gehe davon aus, dass es ähnlich ist yarn.lock
und composer.lock
, die beide in der Quellcodeverwaltung bleiben sollen.
git log
erleichtert den Umgang.Antworten:
Ja,
package-lock.json
soll in die Quellcodeverwaltung eingecheckt werden. Wenn Sie npm 5 verwenden, wird dies möglicherweise in der Befehlszeile angezeigt:created a lockfile as package-lock.json. You should commit this file.
Lautnpm help package-lock.json
:quelle
package-lock.json
auf meine.gitignore
... zurückgreifen. Es verursachte mir weit mehr Probleme als sie zu lösen. Es kommt immer zu Konflikten, wenn wir zusammenführen oder neu aufbauen, und wenn eine Zusammenführung dazu führt,package-lock.json
dass der CI-Server beschädigt wird, ist es nur ein Schmerz, das Problem weiterhin beheben zu müssen.Ja, es soll eingecheckt werden. Ich möchte vorschlagen, dass es ein eigenes Commit erhält. Wir stellen fest, dass es unseren Unterschieden viel Lärm hinzufügt.
quelle
package-lock.json
Datei, wenn Sie an einem SCM-System mit Amtsleitungen und Verzweigung arbeiten? Ich nehme einige Änderungen an einem Zweig vor, die zum Trunk zusammengeführt werden müssen. Muss ich jetzt (irgendwie) Konflikte zwischen den beidenpackage-lock.json
Dateien lösen ? Das fühlt sich schmerzhaft an.Ja du solltest:
package-lock.json
.npm ci
Option nicht,npm install
wenn Sie Ihre Anwendungen sowohl auf Ihrem CI als auch auf Ihrem lokalen Entwicklungscomputer erstellenDer
npm ci
Workflow erfordert das Vorhandensein von apackage-lock.json
.Ein großer Nachteil des
npm install
Befehls ist sein unerwartetes Verhalten, das ihn möglicherweise mutiertpackage-lock.json
, währendnpm ci
nur die in der Sperrdatei angegebenen Versionen verwendet werden und ein Fehler auftrittpackage-lock.json
undpackage.json
nicht synchron sindpackage-lock.json
fehlt.Daher läuft
npm install
lokal, insb. In größeren Teams mit mehreren Entwicklern kann es zu vielen Konflikten innerhalb derpackage-lock.json
und Entwickler kommen, um zu entscheiden, diepackage-lock.json
stattdessen vollständig zu löschen .Es gibt jedoch einen starken Anwendungsfall, um darauf vertrauen zu können, dass die Abhängigkeiten des Projekts auf verschiedenen Maschinen zuverlässig und zuverlässig wiederholt werden.
Von einem erhalten
package-lock.json
Sie genau das: einen bekannten Arbeitszustand.In der Vergangenheit hatte ich Projekte ohne
package-lock.json
/npm-shrinkwrap.json
/yarn.lock
Dateien , deren Build eines Tages scheitern , weil eine zufällige Abhängigkeit eine Bruch Update bekam.Diese Probleme sind schwer zu lösen, da Sie manchmal raten müssen, was die letzte Arbeitsversion war.
Wenn Sie eine neue Abhängigkeit hinzufügen möchten, werden Sie weiterhin ausgeführt
npm install {dependency}
. Wenn Sie ein Upgrade durchführen möchten, verwenden Sie entwedernpm update {dependency}
odernpm install ${dependendency}@{version}
und übernehmen Sie die Änderungpackage-lock.json
.Wenn ein Upgrade fehlschlägt, können Sie zur letzten bekannten Funktion zurückkehren
package-lock.json
.Um npm doc zu zitieren :
Und in Bezug auf den Unterschied zwischen
npm ci
vsnpm install
:Hinweis: Ich stellte eine ähnliche Antwort hier
quelle
whose build would fail one day because a random dependency got a breaking update
Probleme. Es bleibt jedoch die Möglichkeit, dass die Abhängigkeit des Kindes das gleiche Problem verursacht.Ja, die beste Vorgehensweise ist das Einchecken (JA, CHECK-IN).
Ich bin damit einverstanden, dass es beim Betrachten des Diff viel Lärm oder Konflikte verursacht. Aber die Vorteile sind:
^1.2.3
in Ihrem verwendenpackage.json
, aber wie können Sie sicherstellen, dass jedes Malnpm install
dieselbe Version auf Ihrem Entwicklungscomputer und auf dem Build-Server abgerufen wird, insbesondere in diesen indirekten Abhängigkeitspaketen? Nun,package-lock.json
wird das sicherstellen. (Mit deren Hilfe werdennpm ci
Pakete basierend auf der Sperrdatei installiert)npm audit fix
(ich denke, die Überwachungsfunktion stammt aus npm Version 6).quelle
npm ci
. Die Leute erwähnen häufig, dass apackage-lock.json
eine deterministische Installation von Paketen erlaubt, erwähnen aber fast nie den Befehl, der dieses Verhalten erleichtert! Viele Leute gehen wahrscheinlich fälschlicherweise davon aus, dassnpm install
genau das installiert wird, was in der Sperrdatei enthalten ist ...npm ci
. Ihr Team / leitender Entwickler kann entscheiden, wann ein Update durchgeführt werden soll. Wenn jeder es nur willkürlich festlegt, hat das keinen Sinn und es erzeugt nur Lärm in Ihrem Repo. Die NPM-Dokumentation sollte dies klarer machen. Ich denke, die meisten Entwickler sind nur durch diese Funktion verwirrt.Ich habe diese Datei nicht in meinen Projekten festgeschrieben. Was ist der Punkt ?
Obwohl es wahr ist, dass ich ^ in meinem package.json nie für Bibliotheken verwende, weil ich schlechte Erfahrungen damit gemacht habe.
quelle
package-lock.json
. Einige Repos erfordern möglicherweise nicht die Vorteile, die sich daraus ergeben, und ziehen es möglicherweise vor, keine automatisch generierten Inhalte in der Quelle zu haben.An die Leute, die sich über den Lärm beschweren, wenn sie Git Diff machen:
Ich habe einen Alias verwendet:
Um package-lock.json in diffs für das gesamte Repository (alle, die es verwenden) zu ignorieren, können Sie dies hinzufügen
.gitattributes
:Dies führt zu Unterschieden, die "Binärdateien a / package-lock.json und b / package-lock.json unterscheiden sich, wenn die Paketsperrdatei geändert wurde. Außerdem werden einige Git-Dienste (insbesondere GitLab, aber nicht GitHub) ebenfalls ausgeschlossen Diese Dateien (keine weiteren 10.000 Zeilen geändert!) stammen aus den Unterschieden, wenn Sie dies online anzeigen.
quelle
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
in meinem .bashrc anstelle eines Alias.Ja, Sie können diese Datei festschreiben. Aus den offiziellen Dokumenten des npm :
quelle
npm ci
Installation von package-lock.jsonDeaktivieren Sie package-lock.json global
Geben Sie Folgendes in Ihr Terminal ein:
Das funktioniert bei mir wirklich wie Magie
quelle
~/.npmrc
(zumindest auf meinem Mac OS) mit Inhaltpackage-lock=false
und das gleiche kann in einem bestimmten Projekt neben erfolgennode_modules/
(zBecho 'package-lock=false' >> .npmrc
Ja, es ist eine Standardpraxis, package-lock.json festzuschreiben
Der Hauptgrund für das Festschreiben von package-lock.json ist, dass sich alle im Projekt auf derselben Paketversion befinden.
Vorteile: -
Nachteile: -
Bearbeiten: - Die npm-Installation stellt nicht sicher, dass sich alle im Projekt auf derselben Paketversion befinden. npm ci wird dabei helfen.
quelle
npm ci
stattdessen verwenden würdennpm install
.Meine Verwendung von npm ist das Generieren von minimierten / uglifizierten CSS / JS und das Generieren des Javascript, das auf Seiten benötigt wird, die von einer Django-Anwendung bereitgestellt werden. In meinen Anwendungen wird Javascript auf der Seite ausgeführt, um Animationen zu erstellen, manchmal Ajax-Aufrufe auszuführen, innerhalb eines VUE-Frameworks zu arbeiten und / oder mit dem CSS zu arbeiten. Wenn package-lock.json eine übergeordnete Kontrolle darüber hat, was in package.json enthalten ist, muss möglicherweise eine Version dieser Datei vorhanden sein. Nach meiner Erfahrung hat dies entweder keinen Einfluss darauf, was von npm install installiert wird, oder, falls dies der Fall ist, hat es die Anwendungen, die ich nach meinem Wissen bereitstelle, bisher nicht beeinträchtigt. Ich benutze keine Mongodb oder andere solche Anwendungen, die traditionell Thin Client sind.
Ich entferne package-lock.json aus dem Repo, da die npm-Installation diese Datei generiert und die npm-Installation Teil des Bereitstellungsprozesses auf jedem Server ist, auf dem die App ausgeführt wird. Die Versionskontrolle von Node und Npm erfolgt manuell auf jedem Server, aber ich bin vorsichtig, dass sie gleich sind.
Wenn
npm install
es auf dem Server ausgeführt wird, ändert es package-lock.json. Wenn Änderungen an einer Datei vorgenommen werden, die vom Repo auf dem Server aufgezeichnet wird, können Sie bei der nächsten Bereitstellung WONT keine neuen Änderungen vom Ursprung abrufen. Das heißt, Sie können nicht bereitstellen, da der Pull die Änderungen überschreibt, die an package-lock.json vorgenommen wurden.Sie können eine lokal generierte package-lock.json nicht einmal mit dem auf dem Repo befindlichen Element überschreiben (Hard Origin Master zurücksetzen), da sich npm bei jeder Ausgabe eines Befehls beschwert, wenn die package-lock.json nicht den Inhalt widerspiegelt node_modules aufgrund der Installation von npm, wodurch die Bereitstellung unterbrochen wird. Wenn dies darauf hinweist, dass geringfügig andere Versionen in node_modules installiert wurden, hat mir dies wiederum nie Probleme bereitet.
Wenn sich node_modules nicht in Ihrem Repo befindet (und dies auch nicht sein sollte), sollte package-lock.json ignoriert werden.
Wenn mir etwas fehlt, korrigieren Sie mich bitte in den Kommentaren, aber der Punkt, an dem die Versionierung aus dieser Datei übernommen wird, macht keinen Sinn. Die Datei package.json enthält Versionsnummern, und ich gehe davon aus, dass diese Datei zum Erstellen von Paketen verwendet wird, wenn die npm-Installation erfolgt. Wenn ich sie entferne, beschwert sich die npm-Installation wie folgt:
und der Build schlägt fehl. Wenn Sie jedoch node_modules installieren oder npm zum Erstellen von js / css anwenden, wird keine Beschwerde eingereicht, wenn ich package-lock.json entferne
quelle