Làm cách nào để gỡ cài đặt tất cả các phần phụ thuộc được liệt kê trong package.json (NPM)?


107

Nếu tôi có một tệp package.json được xác định trong thư mục gốc ứng dụng của mình và chạy npm install -gnó sẽ cài đặt tất cả các phụ thuộc được xác định trong package.json, globalablly.

Tuy nhiên, điều này dường như không hoạt động ngược lại.

Nếu tôi thực hiện npm uninstall -gtrong root ứng dụng của mình, nó sẽ báo lỗi, buộc tôi phải chuyển cho nó một tên gói.

Điều này cũng không nên gỡ cài đặt các gói tương tự mà tôi đã cài đặt?

Tôi có làm điều gì sai?


1
FYI lý do của tôi đằng sau không bao giờ sử dụng npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons

1
Hãy nhớ rằng nếu bạn muốn sử dụng một mô-đun cho dự án của mình, bạn phải cài đặt nó cục bộ. Cài đặt một mô-đun trên toàn cầu chỉ cung cấp nhiều lệnh hơn trong thiết bị đầu cuối của bạn, chẳng hạn như với expressjs và express (1).
warchimede

@sgwilly Bạn đã sai khi phải sử dụng node_modules trên toàn cầu - nó thậm chí còn nói như vậy trong docuemention - nodejs.org/api/modules.html#modules_all_together - hàm request () 'thông minh' ở chỗ nó hiển thị ở nhiều vị trí khác nhau để thử và giải quyết một con đường cho một mô-đun bao gồm node_modules toàn cầu
qodeninja

Tôi nên nói cụ thể hơn: đúng là request () đủ thông minh để tìm thấy mô-đun được cài đặt toàn cầu của bạn. Nó sẽ hoạt động nếu tất cả các dự án của bạn phụ thuộc vào cùng một phiên bản của mô-đun đã nói đó. Tuy nhiên, bạn có thể gặp khó khăn trong việc duy trì các dự án dựa trên các phiên bản mô-đun khác nhau nếu bạn chỉ quản lý các phụ thuộc trên toàn cầu. Đó là lý do tại sao cách tốt nhất là luôn cài đặt các mô-đun cục bộ và chỉ cài đặt chúng trên toàn cầu khi bạn muốn có quyền truy cập vào một số lệnh thực thi hữu ích.
warchimede

@sgwilly - cảm ơn vì đã chia sẻ suy nghĩ của bạn ở đây - đặc biệt là dự án này là một bản phân phối, vì vậy nó không nên cố gắng cập nhật bất cứ thứ gì - các bản cập nhật thực sự sẽ xảy ra qua RPM (lưu ý RPM không phải NPM) và node_modules thực tế được thu nhỏ lại - tôi chỉ cần một cách nhanh chóng làm sạch hệ thống của bất cứ rpm đã kết thúc cài đặt (trong môi trường dev của tôi)
qodeninja

Câu trả lời:


167

Nếu sử dụng Bash, chỉ cần chuyển vào thư mục có tệp package.json của bạn và chạy như sau:

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

Trong trường hợp các gói được cài đặt toàn cầu, hãy chuyển vào %appdata%/npmthư mục của bạn (nếu trên Windows) và chạy lệnh tương tự.

CHỈNH SỬA: Lệnh này ngắt với npm 3.3.6 (Node 5.0). Bây giờ tôi đang sử dụng lệnh Bash sau, lệnh mà tôi đã ánh xạ tới npm_uninstall_all trong tệp .bashrc của mình:

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

Thêm tiền thưởng? nó nhanh hơn!

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


1
Bạn đã đăng lệnh giống hệt như câu trả lời cho "Lệnh xóa tất cả các mô-đun npm trên toàn cầu?". Làm thế nào đây có thể là điều thích hợp để làm trong cả tình huống đó và tình huống này?
không có ai

@AndrewMedico Làm thế nào là nó không thích hợp? Các gói được cài đặt trong tệp package.json của bạn sẽ được cài đặt trong thư mục node_modules của bạn. Lệnh này sẽ đưa mọi thư mục con đến thư mục node_modules và chạy npm uninstall <package>cho từng thư mục. Tôi đã tự mình làm điều này và nó hoạt động xuất sắc!
jedmao

2
@UgoRobain câu hỏi hay. Hóa ra, một số phụ thuộc trở nên thực sự sâu sắc. Trên hệ thống tệp NTFS (Windows), ít nhất, nó gặp sự cố khi xóa các thư mục có tên đường dẫn dài hơn một số loại giới hạn, để lại các thư mục ảo này mà bạn không thể xóa. May mắn thay, hãy npm uninstallquan tâm đến điều đó, đó là lý do tại sao thủ thuật này hữu ích.
jedmao

7
Đây là những gì tôi đã sử dụng để làm điều đó với powershell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier

1
dường như không hoạt động trên cửa sổ. tr is not recognized
Overdrivr

78

Điều này đã làm việc cho tôi:

dấu nhắc lệnh hoặc gitbash vào thư mục node_modules trong dự án của bạn, sau đó thực thi:

npm uninstall *

Đã xóa tất cả các gói cục bộ cho dự án đó.


Điều này không loại bỏ cài đặt toàn cầu?
shinzou,

@shinzou Nó không loại bỏ cài đặt toàn cầu cho tôi.
Taylor Edmiston

1
Trên Mac 10.13.5, điều này gây ra nhiều lỗi như bên dưới "> heapdump@0.3.9 install / Users / vikramanna / node_modules / heapdump> node-gyp xây dựng lại CXX (target) Release / obj.target / addon / src / heapdump. o Trong tệp được bao gồm từ ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: error: không có thành viên nào có tên 'GetCpuProfiler' trong 'v8 :: Isolate' return isolate-> GetCpuProfiler () -> StartProfiling (title, record_samples); "
vikramvi

35

Đối với cửa sổ, hãy truy cập vào node_modules dir và chạy nó trong powershell

npm uninstall (Get-ChildItem).Name 

Đối với tôi, điều này dẫn đến lỗi "Dòng lệnh quá dài."
Daniel

29

Gần đây tôi đã tìm thấy một lệnh nút cho phép gỡ cài đặt tất cả các phụ thuộc phát triển như sau:

npm prune --production

Như tôi đã đề cập, lệnh này chỉ gỡ cài đặt các gói phụ thuộc phát triển. Ít nhất nó đã giúp tôi không phải làm điều đó một cách thủ công.


8

Mẹo dành cho người dùng Windows: Chạy lệnh PowerShell này từ trong node_modulesthư mục mẹ:

ls .\node_modules | % {npm uninstall $_}

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

Về cơ bản, điều này tạo ra một package.json giả, trống rỗng, các lệnh gọi npm pruneđể xóa mọi thứ trong node_modules, khôi phục package.json ban đầu và cài đặt lại mọi thứ.

Một số giải pháp khác có thể thanh lịch hơn, nhưng tôi nghi ngờ điều này nhanh hơn và đầy đủ hơn. Trên các chủ đề khác, tôi đã thấy mọi người đề xuất chỉ xóa thư mục node_modules, nhưng ít nhất đối với windows, điều này khiến npm bị nghẹt sau đó vì thư mục bin bị thiếu. Có thể trên linux nó được khôi phục đúng cách, nhưng không phải windows.


1
Trong trường hợp của tôi - tôi không cần package.json hiện có (vì chạy tập lệnh trên CI sau khi các tập lệnh npm được thực thi ..) Vì vậy, tôi chỉ sử dụng: "echo {}> package.json & npm mận"
Rikki

5

Trên thực tế, không có tùy chọn nào để làm điều đó, nếu bạn muốn gỡ cài đặt các gói package.jsonchỉ cần thực hiện npm lstrên cùng một thư mục package.jsondựa vào và sử dụng npm uninstall <name>hoặc npm rm <name>cho gói bạn muốn gỡ bỏ.


8
Tôi biết cách xóa chúng riêng lẻ - sẽ có ý nghĩa hơn nếu có một lệnh chạy đối với tệp package.json giống như cách npm install hoạt động.
qodeninja

Không, chúng tôi không muốn gỡ cài đặt bằng tay từng mô-đun.
shinzou,

1
  1. loại bỏ các phụ thuộc không mong muốn khỏi package.json
  2. npm i

" npm i" sẽ không chỉ cài đặt các deps bị thiếu, nó cập nhật node_modules để khớp với package.json


1

( Đừng lặp lại các bước này cho đến khi bạn đọc hết mọi thứ )

Đối với tôi, tất cả các giải pháp được đề cập đều không hoạt động. Soo tôi đã đến /usr/libvà chạy đến đó

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

Nhưng nó cũng loại bỏ npmgói và chỉ một nửa số gói (cho đến khi nó đạt đến chữ cái n).

Vì vậy, tôi đã cố gắng cài đặt lại nút theo hướng dẫn nút.

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

Nhưng nó không cài đặt npmlại.

Vì vậy, tôi quyết định cài đặt lại toàn bộ nút sudo apt-get remove nodejs Và cài đặt lại theo hướng dẫn ở trên.

Bây giờ NPM đã hoạt động trở lại nhưng các mô-đun toàn cầu vẫn ở đó. Vì vậy, tôi đã kiểm tra nội dung của thư mục /usr/lib/node_modulesvà có vẻ như điều quan trọng duy nhất ở đây là npm. Vì vậy, tôi đã chỉnh sửa lệnh ở trên để gỡ cài đặt mọi thứ ngoại trừnpm

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

Nó loại bỏ tất cả các mô-đun những gì không có tiền tố @. Soo Tôi đã mở rộng vòng lặp cho các thư mục con.

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;

Của tôi /usr/lib/node_modulesbây giờ chỉ chứa npmvà các gói được liên kết.


0

Thậm chí bạn không cần phải chạy vòng lặp cho điều đó.

Bạn có thể xóa tất cả các node_modules bằng cách sử dụng một lệnh duy nhất: -

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

0

Người dùng Powershell: foreach($package in ls node_modules){npm uninstall $package}

Cảm ơn @JustMailer


0

Piggy ủng hộ VIKAS KOHLIjedmao , bạn có thể làm được điều này

phiên bản dòng đơn:

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

phiên bản nhiều hàng:

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

0

Một tùy chọn ĐƠN GIẢN khác là xóa node_modules và package-lock.json

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

Sau đó, bạn có thể thử cài đặt lại các gói npm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.