npm Paket überprüfen und bei Bedarf aktualisieren


471

Wir müssen den Karma-Testläufer in TeamCity integrieren und dafür möchte ich den Systemingenieuren ein kleines Skript (Powershell oder was auch immer) geben, das:

  1. nimm die gewünschte Versionsnummer aus einer Konfigurationsdatei (ich denke, ich kann sie als Kommentar direkt in die karma.conf.js)

  2. Überprüfen Sie, ob die definierte Version von Karma Runner im globalen Repo von npm installiert ist

  3. Wenn dies nicht der Fall ist oder die installierte Version älter als gewünscht ist: Nehmen Sie die richtige Version auf und installieren Sie sie

  4. starte es: karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

Meine eigentliche Frage lautet also: "Wie kann man ein Skript einchecken, wenn die gewünschte Version des Pakets installiert ist?". Sollten Sie die Überprüfung durchführen, oder ist es sicher, npm -g installjedes Mal anzurufen?

Ich möchte nicht immer die neueste verfügbare Version überprüfen und installieren, da andere Konfigurationswerte möglicherweise nicht mehr kompatibel sind

Antworten:


609

So überprüfen Sie, ob ein Modul in einem Projekt "alt" ist:

npm outdated

' veraltet ' überprüft jedes in definierte Modul package.jsonund prüft, ob es eine neuere Version in der NPM-Registrierung gibt.

Beispiel: xml2js 0.2.6(befindet sich im node_modulesaktuellen Projekt) ist veraltet, weil eine neuere Version vorhanden ist (0.2.7). Du würdest sehen:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

Um alle Abhängigkeiten zu aktualisieren , ist dies wünschenswert, wenn Sie sicher sind:

npm update

Oder eine einzige Abhängigkeit zu aktualisieren, wie xml2js:

npm update xml2js

6
Seien Sie vorsichtig mit npm updatebesonders mit npm update -g... es tut nicht das, was die meisten Peaole erwarten! Siehe: github.com/npm/npm/issues/6247 und gist.github.com/othiym23/4ac31155da23962afd0e
jbandi

6
@jbandi Ab npm@2.6.1 npm -g updateist die Wiederverwendung sicher. github.com/npm/npm/issues/6247#issuecomment-92182814
Chuck Le Butt

7
Bitte beachten Sie, dass das npm-Update Ihre package.json-Datei nicht aktualisiert, wie in der Antwort von @Erik Olson angegeben.
Ehtesham Hasan

5
As of npm@5.0.0, 'npm update' will change package.json to save the new version as the minimum required dependency docs.npmjs.com/cli/update.html
Sidney

368

npm outdatedidentifiziert Pakete, die aktualisiert werden sollen, und npm update <package name>kann zum Aktualisieren jedes Pakets verwendet werden. Vor npm@5.0.0 npm update <package name>werden jedoch die Versionen in Ihrer package.json nicht aktualisiert, was ein Problem darstellt.

Der beste Workflow ist:

  1. Identifizieren Sie veraltete Pakete
  2. Aktualisieren Sie die Versionen in Ihrer package.json
  3. Führen Sie npm updatediese Option aus, um die neuesten Versionen jedes Pakets zu installieren

Schauen Sie sich npm-check-updatesan, um bei diesem Workflow zu helfen.

  • Installieren Sie npm-check-updates
  • Ausführen, npm-check-updatesum aufzulisten, welche Pakete veraltet sind (im Grunde dasselbe wie Ausführen npm outdated)
  • Führen Sie es aus npm-check-updates -u, um alle Versionen in Ihrer package.json zu aktualisieren (dies ist die magische Sauce).
  • Führen Sie es npm updatewie gewohnt aus, um die neuen Versionen Ihrer Pakete basierend auf der aktualisierten package.json zu installieren

3
npm outdatedzeigt ALLE Pakete an .. auch in anderen Paketen .. aber diese werden mit diesem Verfahren nicht aktualisiert, so dass sie immer angezeigt werden .. Verwenden npm-check-updatesSie also einfach (wie Sie es tatsächlich empfohlen haben), das nur Hauptpakete von package.json... anzeigt. Dies ist relevant
Davidhq

Mit Garn ist dies viel einfacher. Geben Sie einfach "Garn-Upgrade" ein.
Christopher Grigg

17
Warum muss ich einen Update Manager installieren, um meinen Paketmanager zu verwalten? Sind wir uns nicht einig, dass das albern ist? Es sollte so einfach sein wie, npm install --all-outdatedaber es ist nicht ...
ADJenks

3
Sie können jederzeit ausführen npm update --save package_name, um die letzte Änderung in package.json zu speichern.
Trungk18

Erik, kannst du bitte diese verwandte SO-Frage beantworten , weil es für mich immer noch ein bisschen verwirrend ist, npm updatewelchen Unterschied zwischen beiden Befehlen besteht, dh gegen npm-check-updates?
João Pimentel Ferreira

146

Es gibt auch ein "frisches" Modul namens npm-check:

npm-check

Suchen Sie nach veralteten, falschen und nicht verwendeten Abhängigkeiten.

Geben Sie hier die Bildbeschreibung ein

Es bietet auch eine bequeme interaktive Möglichkeit, die Abhängigkeiten zu aktualisieren.


78

Ein einfacher Schritt:

$ npm i -g npm-check-updates && ncu -u && npm i

Das ist alles. Alle Paketversionen in package.jsonsind die neuesten Hauptversionen.

Bearbeiten:

Was passiert hier?

  1. Installieren eines Pakets, das Updates für Sie überprüft.

  2. Verwenden Sie dieses Paket, um alle Paketversionen in Ihrem zu aktualisieren package.json(-u steht für --updateAll).

  3. Installieren Sie alle neuen Versionen der Pakete.


3
@imnickvaughn ncusteht für Node-Check-Updates und -aist die Option 'upgradeAll'. Hier finden Sie alle Optionen: npmjs.com/package/npm-check-updates
Arian Acosta

Und was ist, wenn ich es in einer Zeile tun möchte, ohne ein anderes Paket wie ncu zu verwenden?
ADJenks

Oder ohne die globale Installation,npx -p npm-check-updates ncu -u
Entozoon

68
  • So aktualisieren Sie ein einzelnes lokales Paket:

    1. Finden Sie zuerst Ihre veralteten Pakete heraus:

      npm outdated

    2. Aktualisieren Sie dann das Paket oder die Pakete, die Sie manuell möchten, wie folgt:

      npm update --save package_name

Auf diese Weise ist es nicht erforderlich, Ihre lokale package.json Datei zu aktualisieren .

Beachten Sie, dass dadurch Ihr Paket auf die neueste Version aktualisiert wird.

  • Wenn Sie eine Version in Ihre package.jsonDatei schreiben und Folgendes tun:

    npm update package_name

    In diesem Fall erhalten Sie nur die nächste stabile Version (gesucht) bezüglich der Version, die Sie in Ihre package.jsonDatei geschrieben haben.

Und mit npm list (package_name)können Sie die aktuelle Version Ihrer lokalen Pakete herausfinden.


14

NPM-Befehle zum Aktualisieren oder Beheben von Schwachstellen in einigen Abhängigkeitsmanifestdateien

  • Verwenden Sie den folgenden Befehl, um veraltete oder Schwachstellen in Ihren Knotenmodulen zu überprüfen.

    npm audit

  • Wenn Schwachstellen gefunden wurden, verwenden Sie den folgenden Befehl, um alle Probleme zu beheben.

    npm audit fix

  • Wenn es bei Ihnen nicht funktioniert, versuchen Sie es

    npm audit fix -fDieser Befehl behebt fast alle Schwachstellen. Einige Abhängigkeiten oder devDependencies sind in der Datei package-lock.json gesperrt , daher verwenden wir das -fFlag, um die Aktualisierung zu erzwingen.

  • Wenn Sie Force Audit Fix nicht verwenden möchten, können Sie Ihre Abhängigkeitsversionen manuell korrigieren, indem Sie sie in den Dateien package-lock.json und package.json ändern . Dann renne

npm update && npm upgrade



10

Dieser Befehl führt keine zusätzlichen Pakete aus, um nur veraltete zu überprüfen und diejenigen zu aktualisieren, die vorhanden sind:

npm install $(npm outdated | cut -d' ' -f 1 | sed '1d' | xargs -I '$' echo '$@latest' | xargs echo)


Gutes Zeug Mann, danke!
Dr.Kreso

Dies ist eine großartige Antwort, da es in jedes Shell-Skript eingefügt werden kann, um diesen Schritt zu automatisieren, ohne dass ein weiteres Paket installiert werden muss.
Jankapunkt

4

Bei der Installation von npm-Paketen (sowohl global als auch lokal) können Sie eine bestimmte Version definieren, indem Sie mithilfe der @versionSyntax eine zu installierende Version definieren.

Mit anderen Worten: npm install -g karma@0.9.2 Wenn Sie Folgendes tun, wird sichergestellt, dass nur 0.9.2 installiert ist, und es wird nicht neu installiert, wenn es bereits vorhanden ist.

Als Ratschlag würde ich empfehlen, globale npm-Installationen zu vermeiden, wo immer Sie können. Vielen Menschen ist nicht klar, dass eine Abhängigkeit, die eine Bin-Datei definiert, unter ./node_modules/.bin/ installiert wird. Oft ist es sehr einfach, die lokale Version eines installierten Moduls zu verwenden, die in Ihrer package.json definiert ist. Tatsächlich fügen npm-Skripte die ./node_modules/.bin Ihrem Pfad hinzu.

Als Beispiel ist hier eine package.json, die beim Ausführen npm install && npm testdie in meiner package.json definierte Version von Karma installiert und diese Version von Karma (installiert unter node_modules / .bin / karma) verwendet, wenn das testSkript ausgeführt wird:

{
 "name": "myApp",
 "main": "app.js",
 "scripts": {
   "test": "karma test/*",
 },
 "dependencies": {...},
 "devDependencies": {
   "karma": "0.9.2"
 }
}

Dies gibt Ihnen den Vorteil, dass Ihre package.json die zu verwendende Karma-Version definiert und diese Konfiguration nicht global auf Ihrer CI-Box behalten muss.


Was ist im testDrehbuch? Können Sie mir bitte einen Hinweis geben, wie Sie es mit einem Skript installieren?
iLemming

1
Schauen Sie sich die package.json an. Unter der Eigenschaft "scripts" können Sie eine andere Eigenschaft definieren, "test", deren Wert ein Befehl ist, den Sie bei der Eingabe ausführen möchten npm test. npm docs sind hier ziemlich gut: npmjs.org/doc/scripts.html
addisonj

4

Ab npm@5.0.0+ können Sie einfach Folgendes tun:

npm update <package name>

Dadurch wird die Datei automatisch aktualisiert package.json. Wir müssen die neueste Version nicht manuell aktualisieren und dann verwendennpm update <package name>

Sie können immer noch das alte Verhalten mit erhalten

npm update --no-save

( Referenz )


1

Um wirklich nur ein Paket zu aktualisieren, installieren Sie die NCU und führen Sie sie dann nur für dieses Paket aus. Dies wird auf den neuesten Stand gebracht.

npm install -g npm-check-updates

ncu -f your-intended-package-name -u

6
Post von geringer Qualität, eine bessere Erklärung würde helfen.
Linuxfan sagt Reinstate Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.