Jak odinstalować wszystkie zależności wymienione w pliku package.json (NPM)?

107

Jeśli mam plik package.json zdefiniowany w katalogu głównym aplikacji i uruchomię npm install -ggo, zainstaluje on wszystkie zależności zdefiniowane w pliku package.json, globablly.

Jednak to nie wydaje się działać w odwrotnej kolejności.

Jeśli zrobię to npm uninstall -gw katalogu głównym mojej aplikacji, generuje błąd, oczekując, że przekażę mu nazwę pakietu.

Czy nie powinno to również odinstalować tych samych pakietów, które zainstalowałem?

czy robię coś źle?

qodeninja
źródło
1
FYI, dlaczego nie używam npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons
1
Pamiętaj, że jeśli chcesz użyć modułu do swojego projektu, musisz zainstalować go lokalnie. Globalna instalacja modułu zapewnia tylko więcej poleceń w terminalu, jak na przykład w przypadku expressjs i express (1).
warchimede
@sgwilly Mylisz się co do tego, że musisz używać node_modules globalnie - jest to nawet napisane w dokumentacji - nodejs.org/api/modules.html#modules_all_together - funkcja require () jest ` ` inteligentna '', ponieważ wygląda w różnych lokalizacjach spróbować rozwiązać ścieżkę do modułu zawierającego globalne node_modules
qodeninja
Powinienem był być bardziej szczegółowy: to prawda, że ​​require () jest wystarczająco inteligentny, aby znaleźć twój globalnie zainstalowany moduł. Będzie działać, jeśli wszystkie twoje projekty będą zależeć od tej samej wersji wspomnianego modułu. Jednak utrzymanie projektów opartych na różnych wersjach modułów może być trudne, jeśli zarządzasz zależnościami tylko na całym świecie. Dlatego najlepszą praktyką jest zawsze instalowanie modułów lokalnie i instalowanie ich globalnie tylko wtedy, gdy chcesz uzyskać dostęp do niektórych przydatnych poleceń wykonywalnych.
warchimede
@sgwilly - dziękuję za podzielenie się swoimi przemyśleniami - ten projekt w szczególności jest do rozpowszechniania, więc nie powinien próbować niczego aktualizować - faktycznie aktualizacje będą odbywać się przez RPM (uwaga RPM, a nie NPM), a rzeczywiste moduły node_modules są opakowane Potrzebowałem tylko sposobu, aby szybko wyczyścić system z tego, co rpm ostatecznie zainstalował (w moim środowisku
deweloperskim

Odpowiedzi:

168

Jeśli używasz Bash, po prostu przełącz się do folderu zawierającego plik package.json i uruchom następujące polecenie:

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

W przypadku pakietów zainstalowanych globalnie przejdź do swojego %appdata%/npmfolderu (jeśli jest w systemie Windows) i uruchom to samo polecenie.

EDYCJA: To polecenie nie działa z npm 3.3.6 (Node 5.0). Teraz używam następującego polecenia Bash, które zamapowałem na npm_uninstall_all w moim pliku .bashrc:

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

Dodatkowy bonus? jest dużo szybszy!

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

jedmao
źródło
1
Wysłałeś dokładnie to samo polecenie jako odpowiedź na pytanie „Polecenie globalnego usunięcia wszystkich modułów npm?”. Jak to może być właściwe w tej i tej sytuacji?
nikt
@AndrewMedico Dlaczego nie jest to właściwe? Pakiety zainstalowane w pliku package.json zostaną zainstalowane w folderze node_modules. To polecenie przeniesie każdy podfolder do folderu node_modules i uruchomi się npm uninstall <package>dla każdego folderu. Sam to zrobiłem i działa doskonale!
jedmao
2
@UgoRobain dobre pytanie. Jak się okazuje, niektóre zależności są naprawdę głębokie. Przynajmniej w systemie plików NTFS (Windows) ma problemy z usuwaniem katalogów, w których nazwa ścieżki jest dłuższa niż jakiś limit, pozostawiając te katalogi pozorne, których nie można usunąć. Na szczęście npm uninstalldba o to, dlatego ta sztuczka się przydaje.
jedmao
7
Oto, co robiłem z PowerShell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier
1
nie wydaje się działać w systemie Windows. tr is not recognized
Overdrivr
79

To zadziałało dla mnie:

wiersz polecenia lub gitbash do folderu node_modules w projekcie, a następnie wykonaj:

npm uninstall *

Usunięto wszystkie pakiety lokalne dla tego projektu.

Druubacca
źródło
Czy to nie usuwa również instalacji globalnych?
shinzou,
@shinzou Nie spowodowało to usunięcia instalacji globalnych.
Taylor Edmiston
1
W systemie Mac 10.13.5 powoduje to wiele błędów, jak poniżej "> [email protected] install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (target) Release / obj.target / addon / src / heapdump. o W pliku zawartym z ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: error: brak elementu członkowskiego o nazwie „GetCpuProfiler” w „v8 :: Isolate” return isolate-> GetCpuProfiler () -> StartProfiling (tytuł, record_samples); "
vikramvi
35

W systemie Windows przejdź do katalogu node_modules i uruchom go w programie PowerShell

npm uninstall (Get-ChildItem).Name 
Sameer
źródło
U mnie powoduje to błąd „Wiersz poleceń jest za długi”.
Daniel
29

Niedawno znalazłem polecenie węzła, które umożliwia odinstalowanie wszystkich zależności programistycznych w następujący sposób:

npm prune --production

Jak wspomniałem, to polecenie odinstalowuje tylko pakiety zależności deweloperskich. Przynajmniej pomogło mi to, że nie musiałem tego robić ręcznie.

chalo
źródło
8

Wskazówka dla użytkowników systemu Windows: Uruchom to polecenie programu PowerShell z node_moduleskatalogu nadrzędnego:

ls .\node_modules | % {npm uninstall $_}
y0n1
źródło
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

To zasadniczo tworzy fałszywy, pusty plik package.json, wywołuje npm pruneusunięcie wszystkiego w node_modules, przywraca oryginalny plik package.json i ponownie instaluje wszystko.

Niektóre inne rozwiązania mogą być bardziej eleganckie, ale podejrzewam, że jest to szybsze i wyczerpujące. W innych wątkach widziałem, jak ludzie sugerują po prostu usunięcie katalogu node_modules, ale przynajmniej w przypadku Windows powoduje to, że npm dusi się później, ponieważ katalog bin znika. Może na Linuksie zostanie poprawnie przywrócony, ale nie Windows.

meem
źródło
1
W moim przypadku - nie potrzebowałem istniejącego package.json (ze względu na uruchomienie skryptu na CI po wykonaniu skryptów npm ..) Więc poszedłem z: "echo {}> package.json & npm prune"
Rikki
5

Właściwie nie ma takiej opcji, jeśli chcesz odinstalować pakiety, package.jsonpo prostu zrób to npm lsw tym samym katalogu, który jest package.jsonzależny i użyj npm uninstall <name>lub npm rm <name>dla pakietu, który chcesz usunąć.

Gntem
źródło
8
Wiem, jak usuwać je pojedynczo - po prostu byłoby bardziej sensowne, gdyby istniała komenda do uruchomienia na pliku package.json w taki sam sposób, jak działa instalacja npm.
qodeninja
Nie, nie chcemy ręcznie odinstalowywać każdego modułu.
shinzou,
1
  1. usuń niechciane zależności z pliku package.json
  2. npm i

npm i” nie tylko zainstaluje brakujące pliki, ale zaktualizuje node_modules, aby pasowały do ​​pliku package.json

Misaka_0x447f
źródło
1

( Nie powtarzaj tych kroków, dopóki nie przeczytasz wszystkiego )

U mnie wszystkie wymienione rozwiązania nie działały. Więc poszedłem /usr/libi tam pobiegłem

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

Ale usunął też npmpaczkę i tylko połowę paczek (aż dotarła do litery n).

Więc spróbowałem ponownie zainstalować węzeł przez przewodnik węzłowy.

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

Ale nie zainstalował się npmponownie.

Postanowiłem więc przeinstalować cały węzeł sudo apt-get remove nodejs I ponownie zainstalować według powyższego przewodnika.

Teraz NPM znowu działa, ale moduły globalne nadal istnieją. Sprawdziłem więc zawartość katalogu /usr/lib/node_modulesi wydaje mi się, że jedyne ważne jest tutaj npm. Więc zmodyfikowałem powyższe polecenie, aby odinstalować wszystko oprócznpm

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

Usunął wszystkie moduły, które nie zostały poprzedzone @. Więc rozszerzyłem pętlę dla podkatalogów.

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;

Mój /usr/lib/node_modulesteraz zawiera tylko npmi połączone pakiety.

siOnzee
źródło
1

Inną PROSTĄ opcją jest usunięcie node_modules i package-lock.json

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

Następnie możesz spróbować ponownie zainstalować pakiety npm

Surowy Phoujdar
źródło
Dzięki za tę sugestię. Nie miałem żadnych pakietów globalnych. Większość odpowiedzi dotyczy opcji -g! Miałem okropny czas na pozbycie się WSZYSTKICH lokalnych pakietów, ponieważ nie wiedząc wystarczająco dużo o nodejs / npm, zrobiłem 'npm install this-and-that' z kilku różnych katalogów. Kiedy używam 'npm uninstall <cokolwiek>', 'npm ls' nadal pokazuje niektóre pakiety. Jestem programistą powłoki, więc wypróbowałem 'odinstalowanie npm' na każdej możliwej części wyjścia 'npm ls'. Żaden nie działał, aby pozbyć się WSZYSTKICH pakietów. Zmęczony, ale znalazłem tę sugestię i naprawiłem problem w 5 minut. Dzięki Harsh.
BReddy
Nie wiem, jaki jest cel package.json, package-lock.json, node_modules, zależności, różnice lokalne / globalne lub jak działa nodejs / npm. Używam modułu nodejs, który jest potrzebny do innego programu. Ponieważ zainstalowałem wiele różnych modułów z 'npm install' z różnych katalogów, chciałem pozbyć się ich WSZYSTKICH naraz. Żadna z pozostałych odpowiedzi o tym nie mówi. Używając tego i polecenia „znajdź” w systemie Linux, mogłem pozbyć się wszystkiego w 5 minut. Nie wiem, dlaczego nikt inny nie uznał tego za pomocne.
BReddy
0

Nawet ty nie musisz w tym celu uruchamiać pętli.

Możesz usunąć wszystkie moduły node_modules za pomocą jedynego pojedynczego polecenia: -

npm uninstall `ls -1 node_modules | tr '/\n' ' '`
VIKAS KOHLI
źródło
0

Użytkownicy Powershell: foreach($package in ls node_modules){npm uninstall $package}

Dzięki @JustMailer

Valentine Bondar
źródło
0

Wycofując się z VIKAS KOHLI i jedmao , możesz to zrobić

wersja jednoprzewodowa:

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' ' '`

wersja wieloliniowa:

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
źródło