Comment désinstaller toutes les dépendances répertoriées dans package.json (NPM)?

107

Si j'ai un fichier package.json défini dans la racine de mon application et que npm install -gje l' exécute, il installera toutes les dépendances définies dans package.json, globalement.

Cependant, cela ne semble pas fonctionner en sens inverse.

Si je le fais npm uninstall -gdans la racine de mon application, cela génère une erreur, m'excitant de lui passer un nom de package.

Cela ne devrait-il pas également désinstaller les mêmes packages que j'ai installés?

Est-ce que je fais quelque chose de mal?

qodeninja
la source
1
FYI mon raisonnement derrière ne jamais utiliser npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons
1
N'oubliez pas que si vous souhaitez utiliser un module pour votre projet, vous devez l'installer localement. L'installation globale d'un module ne fournit que plus de commandes dans votre terminal, comme avec expressjs et express (1) par exemple.
warchimede
@sgwilly Vous avez tort de devoir utiliser node_modules globalement - cela dit même dans la documentation - nodejs.org/api/modules.html#modules_all_together - la fonction require () est `` intelligente '' en ce qu'elle regarde à divers endroits pour essayer de résoudre un chemin pour un module comprenant les global node_modules
qodeninja
J'aurais dû être plus précis: il est vrai que require () est suffisamment intelligent pour trouver votre module installé globalement. Cela fonctionnera si tous vos projets dépendent de la même version de ce module. Pourtant, vous pourriez avoir du mal à gérer des projets reposant sur différentes versions de modules si vous ne gérez les dépendances que globalement. C'est pourquoi il est recommandé de toujours installer les modules localement et de ne les installer globalement que lorsque vous souhaitez accéder à des commandes exécutables pratiques.
warchimede
@sgwilly - merci de partager vos réflexions ici - ce projet en particulier est un distribuable donc il ne devrait pas essayer de mettre à jour quoi que ce soit - les mises à jour se produiront réellement sur RPM (notez RPM et non NPM) et les modules node_modules réels sont rétrécis - J'avais juste besoin d'un moyen de nettoyer rapidement le système de tout ce que le rpm a fini par installer (dans mon environnement de développement)
qodeninja

Réponses:

168

Si vous utilisez Bash, basculez simplement dans le dossier contenant votre fichier package.json et exécutez ce qui suit:

for package in `ls node_modules`; do npm uninstall $package; done;

Dans le cas de packages installés globalement, basculez dans votre %appdata%/npmdossier (si sur Windows) et exécutez la même commande.

EDIT: Cette commande rompt avec npm 3.3.6 (Node 5.0). J'utilise maintenant la commande Bash suivante, que j'ai mappée à npm_uninstall_all dans mon fichier .bashrc:

npm uninstall `ls -1 node_modules | tr '/\n' ' '`

Bonus ajouté? c'est beaucoup plus rapide!

https://github.com/npm/npm/issues/10187

jedmao
la source
1
Vous avez posté exactement la même commande en réponse à "Commande pour supprimer tous les modules npm globalement?". Comment cela peut-il être la chose appropriée à faire à la fois dans cette situation et dans celle-ci?
personne le
@AndrewMedico En quoi n'est-ce pas approprié? Les packages installés dans votre fichier package.json seront installés dans votre dossier node_modules. Cette commande amènera chaque sous-dossier dans le dossier node_modules et s'exécutera npm uninstall <package>pour chaque dossier. Je l'ai fait moi-même et cela fonctionne parfaitement!
jedmao
2
@UgoRobain Bonne question. En fait, certaines dépendances deviennent vraiment profondes. Sur le système de fichiers NTFS (Windows), au moins, il a des problèmes pour supprimer les répertoires dont le nom de chemin est plus long qu'une certaine limite, laissant ces répertoires fantômes que vous ne pouvez pas supprimer. Heureusement, npm uninstalls'occupe de cela, c'est pourquoi cette astuce est utile.
jedmao
7
Voici ce que j'avais l'habitude de faire avec PowerShell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier
1
ne semble pas fonctionner sur Windows. tr is not recognized
Overdrivr
79

Cela a fonctionné pour moi:

invite de commande ou gitbash dans le dossier node_modules de votre projet, puis exécutez:

npm uninstall *

Suppression de tous les packages locaux pour ce projet.

Druubacca
la source
Cela ne supprime-t-il pas également les installations globales?
shinzou
@shinzou Il n'a pas supprimé les installations globales pour moi.
Taylor Edmiston
1
Sur Mac 10.13.5, cela génère de nombreuses erreurs comme ci-dessous "> [email protected] install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (cible) Release / obj.target / addon / src / heapdump. o Dans le fichier inclus depuis ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: erreur: aucun membre nommé 'GetCpuProfiler' dans 'v8 :: Isolate' renvoie isolat-> GetCpuProfiler () -> StartProfiling (titre, échantillons_enregistrement); "
vikramvi
35

Pour Windows, accédez au répertoire node_modules et exécutez-le dans PowerShell

npm uninstall (Get-ChildItem).Name 
Sameer
la source
Pour moi, cela entraîne l'erreur «La ligne de commande est trop longue».
Daniel
29

J'ai récemment trouvé une commande de nœud qui permet de désinstaller toutes les dépendances de développement comme suit:

npm prune --production

Comme je l'ai mentionné, cette commande désinstalle uniquement les packages de dépendance de développement. Au moins, cela m'a aidé à ne pas avoir à le faire manuellement.

chalo
la source
8

Conseil pour les utilisateurs Windows: exécutez cette commande PowerShell à partir du node_modulesrépertoire parent:

ls .\node_modules | % {npm uninstall $_}
y0n1
la source
6
// forcibly remove and reinstall all package dependencies
ren package.json package.json-bak
echo {} > package.json
npm prune
del package.json
ren package.json-bak package.json
npm i

Cela crée essentiellement un faux package.json vide, appelle npm pruneà tout supprimer dans node_modules, restaure le package.json d'origine et réinstalle tout.

Certaines des autres solutions peuvent être plus élégantes, mais je soupçonne que c'est plus rapide et exhaustif. Sur d'autres threads, j'ai vu des gens suggérer de simplement supprimer le répertoire node_modules, mais au moins pour Windows, cela provoque l'étouffement de npm par la suite car le répertoire bin disparaît. Peut-être que sous Linux, il est restauré correctement, mais pas Windows.

meem
la source
1
Dans mon cas - je n'avais pas besoin du package.json existant (à cause de l'exécution du script sur CI après l'exécution des scripts npm ..) Je suis donc allé avec: "echo {}> package.json & npm prune"
Rikki
5

En fait, il n'y a pas d'option pour le faire, si vous souhaitez désinstaller des packages, package.jsonfaites simplement npm lssur le même répertoire qui package.jsondépend et utilise npm uninstall <name>ou npm rm <name>pour le package que vous souhaitez supprimer.

Gntem
la source
8
Je sais comment les supprimer individuellement - cela aurait simplement plus de sens s'il y avait une commande à exécuter sur le fichier package.json de la même manière que npm install fonctionne.
qodeninja
Non, nous ne voulons pas désinstaller manuellement chaque module.
shinzou
1
  1. supprimer les dépendances indésirables de package.json
  2. npm i

" npm i" n'installera pas seulement les deps manquants, il mettra à jour node_modules pour qu'ils correspondent au package.json

Misaka_0x447f
la source
1

( Ne reproduisez pas ces étapes avant d'avoir tout lu )

Pour moi, toutes les solutions mentionnées n'ont pas fonctionné. Alors je suis allé /usr/libet j'ai couru là-bas

for package in `ls node_modules`; do sudo npm uninstall $package; done;

Mais il a également supprimé le npmpaquet et seulement la moitié des paquets (jusqu'à ce qu'il atteigne la lettre n).

J'ai donc essayé à nouveau d'installer node par le guide des nœuds.

# Using Ubuntu
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

Mais il ne s'est pas réinstallé npm.

J'ai donc décidé de réinstaller le nœud entier sudo apt-get remove nodejs et de l'installer à nouveau par le guide ci-dessus.

Maintenant, NPM fonctionne à nouveau mais les modules globaux sont toujours là. J'ai donc vérifié le contenu du répertoire /usr/lib/node_moduleset semble que le seul important ici soit npm. J'ai donc édité la commande ci-dessus pour tout désinstaller saufnpm

for package in $(ls node_modules); do if [ "$package" != "npm" ]; then sudo npm uninstall $package; fi; done;

Il a supprimé tous les modules qui n'étaient pas préfixés @. Donc j'ai étendu la boucle pour les sous-répertoires.

for package in $(ls node_modules); do if [  ${package:0:1} = \@ ]; then 
        for innerPackage in $(ls node_modules/${package}); do
                sudo npm uninstall "$package/$innerPackage";
        done;
fi; done;

My /usr/lib/node_modulesne contient désormais que des npmpackages liés.

siOnzee
la source
1

Une autre option SIMPLE consiste à supprimer les node_modules et package-lock.json

rm -rf node_modules
rm -rf package-lock.json

Après cela, vous pouvez essayer de réinstaller les packages npm

Harsh Phoujdar
la source
Merci pour cette suggestion. Je n'avais aucun package global. La plupart des réponses parlent de l'option -g! J'ai eu un temps horrible à me débarrasser de TOUS les paquets locaux parce que ne connaissant pas suffisamment nodejs / npm, j'ai fait 'npm installer this-and-that' à partir de plusieurs répertoires différents. Quand j'utilise 'npm uninstall <anything>', le 'npm ls' affiche toujours certains packages. Je suis programmeur shell, j'ai donc essayé de «désinstaller npm» sur chaque partie imaginable de la sortie «npm ls». Aucun n'a fonctionné pour se débarrasser de TOUS les paquets. Fatigué, mais j'ai trouvé cette suggestion et j'ai résolu mon problème en 5 minutes. Merci Harsh.
BReddy
Je ne sais pas à quoi servent package.json, package-lock.json, node_modules, dépendances, différences locales / globales ou comment fonctionne nodejs / npm. J'utilise un module nodejs qui est nécessaire pour un autre programme. Depuis que j'ai installé de nombreux modules différents avec 'npm install' à partir de différents répertoires, je voulais m'en débarrasser TOUS en même temps. Aucune des autres réponses n'en parle. En utilisant cette commande et la commande «find» sous Linux, j'ai pu tout supprimer en 5 minutes. Je ne sais pas pourquoi personne d'autre n'a encore trouvé cela utile.
BReddy
0

Même vous n'avez pas besoin de lancer la boucle pour cela.

Vous pouvez supprimer tous les node_modules en utilisant la seule commande unique: -

npm uninstall `ls -1 node_modules | tr '/\n' ' '`
VIKAS KOHLI
la source
0

Utilisateurs PowerShell: foreach($package in ls node_modules){npm uninstall $package}

Merci @JustMailer

Valentine Bondar
la source
0

Piggy-backing de VIKAS KOHLI et jedmao , vous pouvez le faire

version simple ligne:

npm uninstall `ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` `find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`

version multi-lignes:

npm uninstall \
`ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` \
`find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`
Ryan Lecha
la source