comando npm per disinstallare o eliminare i pacchetti inutilizzati in Node.js


414

Esiste un modo per disinstallare semplicemente tutte le dipendenze non utilizzate (non dichiarate) da un progetto Node.js (quelle che non sono più definite in my package.json.) Quando aggiorno la mia applicazione mi piace rimuovere automaticamente i pacchetti non referenziati.


1
Inutilizzato da cosa? Intendi rimuovere le cartelle da node_modulesquando vengono rimosse dalle rispettive package.json?
SLaks,

1
esattamente, mhm npm ll fornisce già un buon suggerimento quali sono i candidati.
Tarion,

Risposte:


670

Nota : le npmversioni recenti lo fanno automaticamente quando sono abilitati i blocchi dei pacchetti, quindi non è necessario tranne che per rimuovere i pacchetti di sviluppo con il --productionflag.


Esegui npm pruneper rimuovere i moduli non elencati in package.json.

Da npm help prune:

Questo comando rimuove i pacchetti "estranei". Se viene fornito un nome di pacchetto, vengono rimossi solo i pacchetti che corrispondono a uno dei nomi forniti.

I pacchetti estranei sono pacchetti che non sono elencati nell'elenco delle dipendenze del pacchetto padre.

Se --productionviene specificato il flag, questo comando rimuoverà i pacchetti specificati in devDependencies.


3
Se lo leggessi correttamente, questo rimuoverà tutte le dipendenze secondarie, dal momento che non sono elencate in package.json. È giusto? Quindi, il prossimo aggiornamento o installazione dovrebbe reinstallarli.
n.

1
Sì, rimuoverà le dipendenze secondarie. Le dipendenze secondarie vengono effettivamente memorizzate nella node_modulesdirectory del modulo , quindi vengono rimosse con il modulo.
Darkhogg,

2
Lasciami fare un esempio. Rimuovo il karma dal mio package.json, ma lascio il pergolato. Quando corro npm prune, mi aspetto che tutto il karma, inclusa la sua node_modulescartella contenente le sue dipendenze, venga rimosso. Che dire delle dipendenze di bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Tecnicamente, quelli non sono elencati nel mio progetto package.json. Quelli vengono rimossi o no?
n.

3
No non lo sono. Nota che sono non nel proprio node_modules, ma dentro node_modules/bower/node_modules , "protetto" da node_modules/bower/package.json. Le dipendenze del pacchetto e quella delle dipendenze del pacchetto non sono miste .
Darkhogg,

2
ed eliminare il foglio termoretraibile prima dell'installazione di npm, avrebbe dovuto essere nelle istruzioni precedenti.
Andy Ray,

306

Se non siete preoccupati per un paio di minuti di tempo per farlo, una soluzione potrebbe essere quella di rm -rf node_modulese npm installdi nuovo per ricostruire i moduli locali.


93
Sarebbe bello se le persone smettessero di sottovalutare questo senza commenti .. è una strategia valida per ripristinare le dipendenze di un progetto del nodo come alternativa alla risposta accettata. Se hai danneggiato il contenuto di una sottodirectory node_modules (facile da fare con dipendenze sym-linked) o se hai avuto ulteriori modifiche come nodo o npm versione bump prune non pulirà correttamente la cartella node_modules ma questa risposta lo farà.
Pyrce,

41
La ricostruzione node_modulesverifica inoltre che il package.jsonfile descriva un grafico delle dipendenze riproducibile. Rimuovere e reinstallare il tuo node_modulesè fondamentalmente un test di distribuzione.
Joemaller,

2
@joemaller Non necessariamente, la maggior parte dei flussi di lavoro di distribuzione ha, implicitamente o esplicitamente, un qualche tipo di cache. Se un pacchetto è già installato e si adatta alle specifiche, viene mantenuto. La rimozione e la reinstallazione comporta l'annullamento dei pacchetti all'ultima versione corrispondente.
Darkhogg

7
npm prunenon ha aiutato un iota, ma questo ha fatto. Il mio problema era un link simbolico rotto.
Eirik Birkeland

8
In molte circostanze non ideali che è attualmente impossibile con npm. Inoltre, la domanda sicuramente non specificava alcun vincolo per il lavoro ripetuto o il recupero aggiuntivo, ma solo come raggiungere l'obiettivo finale. Questa risposta soddisfa la domanda come affermato, nonostante ciò che altri potrebbero desiderare oltre tale obiettivo.
Pyrce,

10

È possibile utilizzare npm-prune per rimuovere i pacchetti estranei.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Questo comando rimuove i pacchetti "estranei". Se viene fornito un nome di pacchetto, vengono rimossi solo i pacchetti che corrispondono a uno dei nomi forniti.

I pacchetti estranei sono pacchetti che non sono elencati nell'elenco delle dipendenze del pacchetto padre.

Se viene specificato il flag --production o la variabile d'ambiente NODE_ENV è impostata su produzione , questo comando rimuoverà i pacchetti specificati in devDependencies . L'impostazione di --no-production negherà NODE_ENV essere pronto per la produzione .

Se la comando --dry-run viene utilizzato il flag , allora non verranno apportate modifiche.

Se il --json viene utilizzata bandiera poi la cambia prugna NPM apportato (o sarebbero state apportate con --dry-run ) vengono stampate come oggetto JSON.

Nel normale funzionamento con i pacchetti bloccati abilitati, i moduli estranei vengono eliminati automaticamente quando i moduli sono installati e sarà necessario questo comando solo con flag --production .

Se hai disabilitato i blocchi dei pacchetti, i moduli estranei non verranno rimossi e spetta a te eseguire npm prune di volta in volta per rimuoverli.

Utilizzare npm-dedupe per ridurre la duplicazione

npm dedupe
npm ddp

Ricerca nella struttura dei pacchetti locale e tenta di semplificare la struttura generale spostando le dipendenze più in alto nella struttura, dove possono essere condivise in modo più efficace da più pacchetti dipendenti.

Ad esempio, considera questo grafico delle dipendenze:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

In questo caso, npm-dedupe trasformerà l'albero in:

 a
 +-- b
 +-- d
 `-- c@1.0.10

A causa della natura gerarchica della ricerca del modulo del nodo, b e d otterranno entrambi la loro dipendenza soddisfatta dal singolo pacchetto c a livello di radice dell'albero.

L'algoritmo di deduplicazione percorre l'albero, spostando ogni dipendenza il più in alto possibile nell'albero, anche se non vengono trovati duplicati. Ciò si tradurrà in un albero piatto e deduplicato.


Ho PIÙ articoli nella mia cartella node_modules dopo aver eseguito npm dedupe. Sospiro!
Neville,
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.