polecenie npm do odinstalowania lub przycięcia nieużywanych pakietów w Node.js

414

Czy istnieje sposób, aby po prostu odinstalować wszystkie nieużywane (niezadeklarowane) zależności z projektu Node.js (te, które nie są już zdefiniowane w moim pliku package.json). Gdy aktualizuję aplikację, chcę, aby pakiety, do których się nie odwoływałem, były automatycznie usuwane.

Tarion
źródło
1
Niewykorzystany przez co? Czy chcesz usunąć foldery, node_modulesgdy są usuwane z odpowiednich package.json?
SLaks
1
dokładnie mhm npm ll już daje dobrą wskazówkę, którzy są kandydatami.
Tarion

Odpowiedzi:

670

Uwaga : Najnowsze npmwersje robią to automatycznie, gdy włączone są blokady pakietów, więc nie jest to konieczne, z wyjątkiem usuwania pakietów programistycznych z --productionflagą.


Uruchom, npm pruneaby usunąć moduły niewymienione w package.json.

Od npm help prune:

To polecenie usuwa „obce” pakiety. Jeśli podano nazwę pakietu, usuwane są tylko pakiety pasujące do jednej z podanych nazw.

Zewnętrzne pakiety to pakiety, które nie są wymienione na liście zależności pakietów nadrzędnych.

Jeśli --productionflaga jest podana, to polecenie usunie pakiety określone w twoich devDependencies.

Darkhogg
źródło
3
Jeśli przeczytam to poprawnie, spowoduje to usunięcie wszystkich zależności zależnych, ponieważ nie są one wymienione w package.json. Czy to prawda? Tak więc następna aktualizacja lub instalacja musiałaby je ponownie zainstalować.
nshew
1
Tak, usunie to zależności zależne. Zależności podrzędne są w rzeczywistości przechowywane we własnym node_moduleskatalogu modułu , więc są usuwane wraz z modułem.
Darkhogg
2
Pozwól, że podam przykład. Usuwam karmę z mojej package.json, ale zostawiam altanę. Kiedy uruchamiam npm prune, oczekuję, że cała karma, w tym własny node_modulesfolder zawierający zależności, zostanie usunięta. Co z zależnościami bowera (bower-json, bower-logger, chmodr, fstream, glob i in.). Technicznie nie są one wymienione w moim projekcie package.json. Czy zostały usunięte, czy nie?
nshew
3
Nie oni nie są. Zauważ, że nie są one twoje node_modules, ale wewnątrz node_modules/bower/node_modules , „chronione” przez node_modules/bower/package.json. Zależności pakietu i zależności pakietu nie są mieszane .
Darkhogg
2
i usuń swoje shrinkwrap przed instalacją npm, powinno być w powyższych instrukcjach.
Andy Ray
306

Jeśli nie martwisz się o kilka minut czasu, aby to zrobić, to rozwiązanie byłoby rm -rf node_modulesi npm installponownie odbudować lokalnych modułów.

Pyrce
źródło
93
Byłoby miło, gdyby ludzie przestali głosować na to bez komentarza. Jest to poprawna strategia resetowania zależności projektu węzła jako alternatywa dla zaakceptowanej odpowiedzi. Jeśli uszkodziłeś zawartość podkatalogu node_modules (łatwe do zrobienia z zależnościami sym-link) lub jeśli masz dodatkowe zmiany, takie jak guzy w wersji węzła lub npm, przycinanie nie wyczyści poprawnie folderu node_modules, ale ta odpowiedź będzie.
Pyrce,
41
Przebudowa node_modulessprawdza również, czy package.jsonplik opisuje odtwarzalny wykres zależności. Usunięcie i ponowna instalacja node_modulesjest w zasadzie testem wdrożenia.
joemaller
2
@joemaller Niekoniecznie większość przepływów pracy wdrażania ma, pośrednio lub jawnie, pewien rodzaj pamięci podręcznej. Jeśli pakiet jest już zainstalowany i pasuje do specyfikacji, zostanie zachowany. Usunięcie, a następnie ponowna instalacja spowoduje zderzenie tego pakietu z najnowszą pasującą wersją.
Darkhogg,
7
npm prunenie pomogło ani jota, ale to pomogło. Mój problem to zepsute dowiązanie symboliczne.
Eirik Birkeland,
8
W wielu nie idealnych okolicznościach, które obecnie są nieosiągalne za pomocą npm. Pytanie to zdecydowanie nie określiło pewnego ograniczenia dla powtarzanej pracy lub dodatkowego pobierania, tylko jak osiągnąć cel końcowy. Ta odpowiedź spełnia postawione pytanie, pomimo tego, czego inni mogą chcieć poza tym celem.
Pyrce
10

Możesz użyć npm-prune do usunięcia obcych pakietów.

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

To polecenie usuwa „obce” pakiety. Jeśli podano nazwę pakietu, usuwane są tylko pakiety pasujące do jednej z podanych nazw.

Zewnętrzne pakiety to pakiety, które nie są wymienione na liście zależności pakietów nadrzędnych.

Jeśli --production flaga jest określona lub NODE_ENV zmienna jest ustawiona do produkcji , to polecenie usunie pakiety podany w devDependencies . Ustawienie - brak produkcji spowoduje zanegowanie ustawienia NODE_ENV na produkcję .

Jeśli zostanie użyta flaga --dry-run, wówczas nie zostaną wprowadzone żadne zmiany.

Jeśli użyta jest flaga --json, zmiany dokonane npm przycinania (lub zostałyby wykonane za pomocą --dry-run ) są drukowane jako obiekt JSON.

W normalnej pracy z włączonymi blokadami pakietów, dodatkowe moduły są automatycznie przycinane po zainstalowaniu modułów i będziesz potrzebować tylko tego polecenia z flagą --production .

Jeśli wyłączyłeś blokady pakietów, wówczas zewnętrzne moduły nie zostaną usunięte i od czasu do czasu musisz je uruchomić npm prune .

Użyj npm-dedupe, aby zmniejszyć powielanie

npm dedupe
npm ddp

Przeszukuje lokalne drzewo pakietów i próbuje uprościć ogólną strukturę, przenosząc zależności dalej w górę drzewa, gdzie mogą być efektywniej współużytkowane przez wiele zależnych pakietów.

Weźmy na przykład ten wykres zależności:

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

W takim przypadku npm-dedupe przekształci drzewo w:

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

Z powodu hierarchicznej natury wyszukiwania modułu węzła, b i d uzyskają swoją zależność od pojedynczego pakietu c na poziomie katalogu głównego drzewa.

Algorytm deduplikacji idzie po drzewie, przesuwając każdą zależność tak wysoko w drzewie, jak to możliwe, nawet jeśli nie znaleziono duplikatów. Spowoduje to zarówno płaskie, jak i deduplikowane drzewo.

Igor Litwinowicz
źródło
Mam więcej elementów w folderze node_modules po uruchomieniu npm dedupe. Westchnienie!
Neville,