Bagaimana Anda menghapus semua dependensi yang terdaftar di package.json (NPM)?

107

Jika saya memiliki file package.json yang ditentukan di root aplikasi saya dan jalankan npm install -g akan menginstal semua dependensi yang ditentukan di package.json, secara global.

Namun, ini sepertinya tidak bekerja secara terbalik.

Jika saya lakukan npm uninstall -gdi root aplikasi saya, itu membuat kesalahan, mengharapkan saya untuk memberikannya nama paket.

Bukankah ini juga harus menghapus paket yang sama yang saya instal?

Apakah saya melakukan sesuatu yang salah?

qodeninja
sumber
1
FYI alasan saya di belakang tidak pernah menggunakan npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons
1
Ingatlah bahwa jika Anda ingin menggunakan modul untuk proyek Anda, Anda harus menginstalnya secara lokal. Menginstal modul secara global hanya menyediakan lebih banyak perintah di terminal Anda, seperti expressjs dan express (1) misalnya.
warchimede
@sgwilly Anda salah karena harus menggunakan node_modules secara global - bahkan dikatakan demikian di dokumen - nodejs.org/api/modules.html#modules_all_together - fungsi require () adalah 'pintar' karena terlihat di berbagai lokasi untuk mencoba dan menyelesaikan jalur untuk modul termasuk global node_modules
qodeninja
Saya seharusnya lebih spesifik: benar bahwa require () cukup pintar untuk menemukan modul Anda yang diinstal secara global. Ini akan berfungsi jika semua proyek Anda bergantung pada versi yang sama dari modul tersebut. Namun, Anda mungkin kesulitan mengelola project yang mengandalkan versi modul yang berbeda jika Anda hanya mengelola dependensi secara global. Itulah mengapa praktik terbaiknya adalah selalu menginstal modul secara lokal, dan hanya menginstalnya secara global ketika Anda ingin mendapatkan akses ke beberapa perintah yang dapat dieksekusi.
warchimede
@sgwilly - terima kasih telah membagikan pemikiran Anda di sini - proyek ini khususnya dapat didistribusikan sehingga tidak boleh mencoba memperbarui apa pun - pembaruan sebenarnya akan terjadi melalui RPM (perhatikan RPM bukan NPM) dan node_modules yang sebenarnya menyusut - Saya hanya perlu cara untuk membersihkan sistem dengan cepat dari apa pun yang akhirnya
dipasang

Jawaban:

168

Jika menggunakan Bash, cukup beralih ke folder yang memiliki file package.json Anda dan jalankan perintah berikut:

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

Dalam kasus paket yang diinstal secara global, alihkan ke %appdata%/npmfolder Anda (jika di Windows) dan jalankan perintah yang sama.

EDIT: Perintah ini rusak dengan npm 3.3.6 (Node 5.0). Saya sekarang menggunakan perintah Bash berikut, yang telah saya petakan ke npm_uninstall_all di file .bashrc saya:

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

Bonus tambahan? itu jauh lebih cepat!

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

jedmao
sumber
1
Anda memposting perintah yang sama persis sebagai jawaban untuk "Perintah untuk menghapus semua modul npm secara global?". Bagaimana ini bisa menjadi hal yang tepat untuk dilakukan baik dalam situasi itu maupun yang ini?
tidak ada
@AndrewMedico Bagaimana tidak tepat? Paket yang diinstal di file package.json Anda akan diinstal di folder node_modules Anda. Perintah ini akan membawa setiap sub-folder ke folder node_modules dan dijalankan npm uninstall <package>untuk setiap folder. Saya melakukan ini sendiri dan bekerja dengan sangat baik!
jedmao
2
@UgoRobain pertanyaan bagus. Ternyata, beberapa dependensi menjadi sangat dalam. Pada sistem file NTFS (Windows), setidaknya, ada masalah saat menghapus direktori di mana nama jalur lebih panjang dari beberapa jenis batas, meninggalkan direktori bayangan ini yang tidak dapat Anda hapus. Untungnya, npm uninstallurus itu, itulah mengapa trik ini berguna.
jedmao
7
Inilah yang biasa saya lakukan dengan PowerShell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier
1
sepertinya tidak berfungsi di jendela. tr is not recognized
Overdrivr
78

Ini berhasil untuk saya:

command prompt atau gitbash ke dalam folder node_modules di proyek Anda lalu jalankan:

npm uninstall *

Menghapus semua paket lokal untuk proyek itu.

Druubacca
sumber
Bukankah ini juga menghapus pemasangan global?
shinzou
@shinzou Itu tidak menghapus pemasangan global untuk saya.
Taylor Edmiston
1
Pada Mac 10.13.5, ini memunculkan banyak kesalahan seperti di bawah ini "> [email protected] install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (target) Release / obj.target / addon / src / heapdump. o Dalam file yang disertakan dari ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: error: tidak ada anggota bernama 'GetCpuProfiler' di 'v8 :: Isolate' return isolate-> GetCpuProfiler () -> StartProfiling (judul, record_samples); "
vikramvi
35

Untuk windows, buka node_modules dir dan jalankan ini di PowerShell

npm uninstall (Get-ChildItem).Name 
Sameer
sumber
Bagi saya, ini menghasilkan kesalahan "Baris perintah terlalu panjang."
Daniel
29

Saya baru-baru ini menemukan perintah node yang memungkinkan menghapus semua dependensi pengembangan sebagai berikut:

npm prune --production

Seperti yang saya sebutkan, perintah ini hanya mencopot pemasangan paket ketergantungan pengembangan. Setidaknya itu membantu saya untuk tidak melakukannya secara manual.

chalo
sumber
8

Tip untuk pengguna Windows: Jalankan perintah PowerShell ini dari dalam node_modulesdirektori induk:

ls .\node_modules | % {npm uninstall $_}
y0n1
sumber
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

Ini pada dasarnya membuat panggilan package.json palsu dan kosong npm prune untuk menghapus semua yang ada di node_modules, memulihkan package.json asli dan menginstal ulang semuanya.

Beberapa solusi lain mungkin lebih elegan, tetapi saya rasa ini lebih cepat dan lengkap. Di utas lain saya telah melihat orang menyarankan untuk menghapus direktori node_modules, tetapi setidaknya untuk windows, ini menyebabkan npm tersedak sesudahnya karena direktori bin hilang. Mungkin di linux dapat dipulihkan dengan benar, tetapi tidak untuk windows.

meem
sumber
1
Dalam kasus saya - saya tidak memerlukan package.json yang ada (karena menjalankan skrip pada CI setelah skrip npm dijalankan ..) Jadi saya hanya menggunakan: "echo {}> package.json & npm prune"
Rikki
5

Sebenarnya tidak ada pilihan untuk melakukan itu, jika Anda ingin menghapus paket dari package.jsoncukup lakukan npm lspada direktori yang sama yang package.jsonbergantung dan gunakan npm uninstall <name>atau npm rm <name>untuk paket yang ingin Anda hapus.

Gntem
sumber
8
Saya tahu cara menghapusnya satu per satu - akan lebih masuk akal jika ada perintah untuk menjalankan file package.json dengan cara yang sama seperti npm install bekerja.
qodeninja
Tidak, kami tidak ingin menghapus setiap modul secara manual.
shinzou
1
  1. hapus dependensi yang tidak diinginkan dari package.json
  2. npm i

" npm i" tidak hanya akan memasang deps yang hilang, ia juga memperbarui node_modules agar cocok dengan package.json

Misaka_0x447f
sumber
1

( Jangan meniru langkah-langkah ini sampai Anda membaca semuanya )

Bagi saya semua solusi yang disebutkan tidak berhasil. Soo, aku pergi ke /usr/libsana dan lari ke sana

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

Tapi itu juga menghapus file npm paket dan hanya setengah dari paket (sampai mencapai huruf n).

Jadi saya mencoba menginstal node lagi dengan panduan node.

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

Tapi itu tidak terpasang npm lagi.

Jadi saya memutuskan untuk menginstal ulang seluruh node sudo apt-get remove nodejs Dan menginstal lagi dengan panduan di atas.

Sekarang NPM kembali bekerja tetapi modul globalnya masih ada. Jadi saya memeriksa isi direktori /usr/lib/node_modulesdan tampaknya satu-satunya yang penting di sini adalah npm. Jadi saya mengedit perintah di atas untuk menghapus semuanya kecualinpm

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

Itu menghapus semua modul yang tidak diawali @. Soo I memperpanjang loop untuk subdirektori.

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;

/usr/lib/node_modulesSekarang saya hanya berisi npmpaket yang ditautkan.

siOnzee
sumber
0

Bahkan Anda tidak perlu menjalankan loop untuk itu.

Anda dapat menghapus semua node_modules dengan menggunakan satu-satunya perintah: -

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

Pengguna Powershell: foreach($package in ls node_modules){npm uninstall $package}

Terima kasih @JustMailer

Valentine Bondar
sumber
0

Piggy-mundur dari VIKAS Kohli dan jedmao , Anda dapat melakukan ini

versi baris tunggal:

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

versi multi-baris:

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
sumber
0

Opsi SEDERHANA lainnya adalah menghapus node_modules dan package-lock.json

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

Setelah ini, Anda dapat mencoba menginstal ulang paket npm

Phoujdar yang keras
sumber