npm controlla e aggiorna il pacchetto se necessario


471

Dobbiamo integrare il test runner Karma in TeamCity e per questo mi piacerebbe dare un piccolo script sys-engineer (powershell o altro) che avrebbe:

  1. raccogli il numero di versione desiderato da un file di configurazione (suppongo di poterlo inserire come commento direttamente nel karma.conf.js)

  2. controlla se la versione definita di karma runner è installata nel repository globale di npm

  3. in caso contrario, o la versione installata è precedente a quella desiderata: selezionare e installare la versione corretta

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

Quindi la mia vera domanda è: "come si può controllare in uno script, se la versione desiderata del pacchetto è installata?". Dovresti fare il controllo o è sicuro chiamare solo npm -g installogni volta?

Non voglio controllare e installare sempre l'ultima versione disponibile, perché altri valori di configurazione potrebbero diventare incompatibili

Risposte:


609

Per verificare se un modulo in un progetto è "vecchio":

npm outdated

' obsoleto ' controllerà ogni modulo definito package.jsone vedrà se c'è una versione più recente nel registro NPM.

Ad esempio, dire xml2js 0.2.6(che si trova nel node_modulesprogetto corrente) non è aggiornato perché esiste una versione più recente (0.2.7). Vedresti:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

Per aggiornare tutte le dipendenze, se si è certi che ciò sia desiderabile:

npm update

Oppure, per aggiornare una singola dipendenza come xml2js:

npm update xml2js

6
Fai attenzione npm updatesoprattutto con npm update -g... non è quello che la maggior parte dei pavoni si aspetta che faccia! Vedi: github.com/npm/npm/issues/6247 e gist.github.com/othiym23/4ac31155da23962afd0e
jbandi,

6
@jbandi A partire da npm@2.6.1, npm -g updateè di nuovo sicuro. github.com/npm/npm/issues/6247#issuecomment-92182814
Chuck Le Butt,

7
Si noti che l'aggiornamento npm non aggiornerà il file package.json come indicato dalla risposta di @Erik Olson.
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 outdatedidentificherà i pacchetti che dovrebbero essere aggiornati e npm update <package name>possono essere utilizzati per aggiornare ciascun pacchetto. Ma prima di npm@5.0.0, npm update <package name>non aggiorneremo le versioni in package.json, il che è un problema.

Il miglior flusso di lavoro è:

  1. Identificare i pacchetti scaduti
  2. Aggiorna le versioni in package.json
  3. Esegui npm updateper installare le ultime versioni di ciascun pacchetto

Dai un'occhiata npm-check-updatesper aiutare con questo flusso di lavoro.

  • Installa npm-check-updates
  • Esegui npm-check-updatesper elencare quali pacchetti non sono aggiornati (sostanzialmente la stessa cosa della corsa npm outdated)
  • Esegui npm-check-updates -uper aggiornare tutte le versioni in package.json (questa è la salsa magica)
  • Esegui npm updatecome al solito per installare le nuove versioni dei tuoi pacchetti in base al pacchetto.json aggiornato

3
npm outdatedmostrerà TUTTI i pacchetti .. anche all'interno di altri pacchetti .. ma quelli non verranno aggiornati con questa procedura in modo che appaiano sempre .. quindi usa npm-check-updates(come hai effettivamente raccomandato) che mostra solo i pacchetti principali da package.json... questo è rilevante
davidhq,

Con il filato questo è molto più semplice, basta digitare 'upgrade filato'.
Christopher Grigg,

17
Perché devo installare un gestore aggiornamenti per gestire il mio gestore pacchetti? Non siamo d'accordo che sia sciocco? Dovrebbe essere semplice npm install --all-outdatedma non lo è ...
ADJenks il

3
Puoi sempre eseguire npm update --save package_nameper salvare l'ultima modifica in package.json.
trungk18,

Erik, puoi gentilmente rispondere a questa domanda SO relativa , perché mi confonde ancora un po 'la differenza tra entrambi i comandi, ovvero npm updatevs npm-check-updates?
João Pimentel Ferreira,

146

Esiste anche un modulo "fresco" chiamato npm-check:

NPM-check

Verificare la presenza di dipendenze obsolete, errate e non utilizzate.

inserisci qui la descrizione dell'immagine

Fornisce inoltre un comodo modo interattivo per aggiornare le dipendenze.


78

Un semplice passo:

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

Questo è tutto. Tutte le versioni del pacchetto package.jsonsaranno le ultime versioni principali.

Modificare:

Cosa sta succedendo qui?

  1. Installazione di un pacchetto che controlla gli aggiornamenti per te.

  2. Usa questo pacchetto per aggiornare tutte le versioni del pacchetto nel tuo package.json(-u è l'abbreviazione di --updateAll).

  3. Installa tutte le nuove versioni dei pacchetti.


3
@imnickvaughn ncusta per nodo-check-updates ed -aè l'opzione 'upgradeAll'. Trova tutte le opzioni qui: npmjs.com/package/npm-check-updates
Arian Acosta

E se volessi farlo in una riga senza usare un altro pacchetto come ncu?
ADJenks il

O senza l'installazione globale,npx -p npm-check-updates ncu -u
entozoon

68
  • Per aggiornare un singolo pacchetto locale:

    1. Per prima cosa scopri i tuoi pacchetti obsoleti:

      npm outdated

    2. Quindi aggiornare il pacchetto oi pacchetti che si desidera manualmente come:

      npm update --save package_name

In questo modo non è necessario aggiornare il package.json file locale .

Nota che questo aggiornerà il tuo pacchetto all'ultima versione.

  • Se scrivi una versione nel tuo package.jsonfile e fai:

    npm update package_name

    In questo caso otterrai solo la prossima versione stabile (desiderata) relativa alla versione che hai scritto nel tuo package.jsonfile.

E con npm list (package_name)te puoi scoprire la versione corrente dei tuoi pacchetti locali.


14

Comandi NPM per aggiornare o correggere le vulnerabilità in alcuni file manifest delle dipendenze

  • Utilizzare il comando seguente per verificare le vulnerabilità obsolete o nei moduli del nodo.

    npm audit

  • Se vengono rilevate vulnerabilità, utilizzare il comando seguente per risolvere tutti i problemi.

    npm audit fix

  • Se non funziona per te, prova

    npm audit fix -f, questo comando risolverà quasi tutte le vulnerabilità. Alcune dipendenze o devDependencies sono bloccate nel file package-lock.json , quindi usiamo -fflag per forzare l'aggiornamento.

  • Se non si desidera utilizzare la correzione forzata del controllo, è possibile correggere manualmente le versioni delle dipendenze modificandole nel file package-lock.json e package.json . Quindi corri

npm update && npm upgrade



10

Nessun pacchetto aggiuntivo, per controllare solo obsoleti e aggiornare quelli che sono, questo comando farà:

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


Brava roba amico, grazie!
drKreso,

Questa è un'ottima risposta perché può essere inserita in qualsiasi script di shell per automatizzare questo passaggio senza fare affidamento sull'installazione di ulteriori pacchetti.
Jankapunkt il

4

Quando si installano pacchetti npm (sia globalmente che localmente) è possibile definire una versione specifica usando la @versionsintassi per definire una versione da installare.

In altre parole, fare: npm install -g karma@0.9.2 assicurerà che sia installato solo 0.9.2 e non verrà reinstallato se esiste già.

Come consiglio, suggerirei di evitare installazioni npm globali ovunque sia possibile. Molte persone non si rendono conto che se una dipendenza definisce un file bin, viene installato in ./node_modules/.bin/. Spesso è molto facile usare quella versione locale di un modulo installato che è definito in package.json. In effetti, gli script npm aggiungeranno il file ./node_modules/.bin al tuo percorso.

Ad esempio, ecco un package.json che, quando eseguirò, npm install && npm testinstallerà la versione di karma definita nel mio package.json e userà quella versione di karma (installata su node_modules / .bin / karma) durante l'esecuzione dello testscript:

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

Questo ti dà il vantaggio del tuo package.json che definisce la versione di karma da usare e non deve mantenere quella configurazione a livello globale sulla tua casella CI.


cosa c'è nella testsceneggiatura? Potete per favore darmi un indizio su come installarlo con uno script.
iLemming

1
Guarda il pacchetto.json. Sotto la proprietà "script", è possibile definire un'altra proprietà, "test" il cui valore è un comando che si desidera eseguire durante la digitazione npm test. i documenti di npm sono abbastanza buoni qui: npmjs.org/doc/scripts.html
addisonj

4

A partire da npm@5.0.0+ puoi semplicemente fare:

npm update <package name>

Ciò aggiornerà automaticamente il package.jsonfile. Non è necessario aggiornare manualmente l'ultima versione e quindi utilizzarlanpm update <package name>

È ancora possibile ottenere il vecchio comportamento utilizzando

npm update --no-save

( Riferimento )


1

Per aggiornare davvero solo un pacchetto installare NCU e quindi eseguirlo solo per quel pacchetto. Questo andrà al vero ultimo.

npm install -g npm-check-updates

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

6
Post di bassa qualità, qualche spiegazione migliore sarebbe di aiuto.
linuxfan dice Reinstate Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.