คุณจะถอนการติดตั้งการอ้างอิงทั้งหมดที่อยู่ใน package.json (NPM) ได้อย่างไร?


107

หากฉันมีไฟล์ package.json ที่กำหนดไว้ในรูทแอปพลิเคชันของฉันและรันnpm install -gมันจะติดตั้งการอ้างอิงทั้งหมดที่กำหนดไว้ใน package.json ทั่วโลก

อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ได้ผลในทางกลับกัน

ถ้าฉันทำnpm uninstall -gในรูทแอปพลิเคชันของฉันมันจะแสดงข้อผิดพลาดให้ฉันส่งชื่อแพ็คเกจไป

สิ่งนี้ไม่ควรถอนการติดตั้งแพ็คเกจเดียวกันกับที่ฉันติดตั้งหรือไม่?

ฉันทำอะไรผิดหรือเปล่า?


1
FYI เหตุผลของฉันที่อยู่เบื้องหลังไม่เคยใช้ npm -g peterlyons.com/problog/2012/09/…
Peter Lyons

1
โปรดจำไว้ว่าหากคุณต้องการใช้โมดูลสำหรับโครงการของคุณคุณต้องติดตั้งในเครื่อง การติดตั้งโมดูลทั่วโลกจะให้คำสั่งเพิ่มเติมในเทอร์มินัลของคุณเท่านั้นเช่นเดียวกับ expressjs และ express (1)
warchimede

@sgwilly คุณคิดผิดที่ต้องใช้ node_modules ทั่วโลก - มันยังบอกอย่างนั้นใน docuemention - nodejs.org/api/modules.html#modules_all_together - ฟังก์ชัน require () เป็น 'อัจฉริยะ' เพราะมันดูในตำแหน่งต่างๆ เพื่อพยายามแก้ไขเส้นทางสำหรับโมดูลรวมถึง global node_modules
qodeninja

ฉันควรจะเจาะจงมากกว่านี้: เป็นเรื่องจริงที่ต้อง () ฉลาดพอที่จะค้นหาโมดูลที่ติดตั้งทั่วโลกของคุณ จะใช้งานได้หากโครงการทั้งหมดของคุณขึ้นอยู่กับเวอร์ชันเดียวกันของโมดูลดังกล่าว แต่คุณอาจมีปัญหาในการดูแลโครงการที่อาศัยโมดูลเวอร์ชันต่างๆกันหากคุณจัดการเฉพาะการอ้างอิงทั่วโลก นั่นเป็นเหตุผลว่าทำไมแนวทางปฏิบัติที่ดีที่สุดในการติดตั้งโมดูลภายในเครื่องเสมอและติดตั้งเฉพาะทั่วโลกเมื่อคุณต้องการเข้าถึงคำสั่งปฏิบัติการที่มีประโยชน์
warchimede

@sgwilly - ขอบคุณสำหรับการแบ่งปันความคิดของคุณที่นี่ - โดยเฉพาะโครงการนี้เป็นโครงการที่กระจายได้ดังนั้นจึงไม่ควรพยายามอัปเดตอะไรเลย - การอัปเดตจริงจะเกิดขึ้นบน RPM (โปรดทราบว่า RPM ไม่ใช่ NPM) และ node_modules จริงจะหดตัว - ฉันแค่ต้องการวิธีทำความสะอาดระบบอย่างรวดเร็วไม่ว่ารอบต่อนาทีจะติดตั้ง (ในสภาพแวดล้อม dev ของฉัน)
qodeninja

คำตอบ:


168

หากใช้ Bash เพียงแค่เปลี่ยนเข้าไปในโฟลเดอร์ที่มีไฟล์ package.json ของคุณแล้วเรียกใช้สิ่งต่อไปนี้:

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

ในกรณีของแพ็คเกจที่ติดตั้งทั่วโลกให้สลับไปที่%appdata%/npmโฟลเดอร์ของคุณ(หากใช้ Windows) และเรียกใช้คำสั่งเดียวกัน

แก้ไข: คำสั่งนี้แบ่งด้วย npm 3.3.6 (Node 5.0) ตอนนี้ฉันใช้คำสั่ง Bash ต่อไปนี้ซึ่งฉันได้แมปกับ npm_uninstall_all ในไฟล์. bashrc ของฉัน:

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

เพิ่มโบนัส? เร็วขึ้น!

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


1
คุณโพสต์คำสั่งเดียวกับคำตอบสำหรับ "คำสั่งเพื่อลบโมดูล npm ทั้งหมดทั่วโลก?" นี่เป็นสิ่งที่เหมาะสมที่จะทำทั้งในสถานการณ์นั้นและสถานการณ์นี้ได้อย่างไร?
ไม่มีใคร

@AndrewMedico ไม่เหมาะสมยังไง? แพ็คเกจที่ติดตั้งในไฟล์ package.json ของคุณจะถูกติดตั้งในโฟลเดอร์ node_modules ของคุณ คำสั่งนี้จะนำทุกโฟลเดอร์ย่อยไปที่โฟลเดอร์ node_modules และเรียกใช้npm uninstall <package>สำหรับแต่ละโฟลเดอร์ ฉันทำด้วยตัวเองและได้ผลดีมาก!
jedmao

2
@UgoRobain คำถามที่ดี เมื่อปรากฎว่าการอ้างอิงบางอย่างนั้นลึกซึ้งมาก ในระบบไฟล์ NTFS (Windows) อย่างน้อยก็มีปัญหาในการลบไดเร็กทอรีที่ชื่อพา ธ ยาวเกินขีด จำกัด บางประเภทออกจากไดเร็กทอรี phantom เหล่านี้ที่คุณไม่สามารถลบออกได้ โชคดีที่npm uninstallดูแลสิ่งนั้นด้วยเหตุนี้เคล็ดลับนี้จึงมีประโยชน์
jedmao

7
นี่คือสิ่งที่ฉันเคยทำกับ powershell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier

1
ดูเหมือนจะไม่ทำงานบน windows tr is not recognized
Overdrivr

79

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

พร้อมรับคำสั่งหรือ gitbash ในโฟลเดอร์ node_modules ในโครงการของคุณจากนั้นดำเนินการ:

npm uninstall *

ลบแพ็คเกจโลคัลทั้งหมดสำหรับโปรเจ็กต์นั้น


สิ่งนี้ไม่ลบการติดตั้งส่วนกลางด้วยหรือ
shinzou

@shinzou มันไม่ได้ลบการติดตั้งส่วนกลางสำหรับฉัน
Taylor Edmiston

1
บน Mac 10.13.5 จะมีข้อผิดพลาดมากมายดังต่อไปนี้ "> heapdump@0.3.9 install / Users / vikramanna / node_modules / heapdump> node-gyp สร้าง CXX ใหม่ (เป้าหมาย) Release / obj.target / addon / src / heapdump o ในไฟล์ที่รวมจาก ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: ข้อผิดพลาด: ไม่มีสมาชิกชื่อ 'GetCpuProfiler' ใน 'v8 :: Isolate' return isolate-> GetCpuProfiler () -> StartProfiling (title, record_samples); "
vikramvi

35

สำหรับ windows ไปที่ node_modules dir และเรียกใช้สิ่งนี้ใน powershell

npm uninstall (Get-ChildItem).Name 

สำหรับฉันสิ่งนี้ทำให้เกิดข้อผิดพลาด "บรรทัดคำสั่งยาวเกินไป"
Daniel

29

ฉันเพิ่งพบคำสั่งโหนดที่อนุญาตให้ถอนการติดตั้งการอ้างอิงการพัฒนาทั้งหมดดังนี้:

npm prune --production

ดังที่ฉันได้กล่าวไปแล้วคำสั่งนี้จะถอนการติดตั้งแพ็คเกจการพึ่งพาการพัฒนาเท่านั้น อย่างน้อยก็ช่วยให้ฉันไม่ต้องทำด้วยตนเอง


8

เคล็ดลับสำหรับผู้ใช้ Windows: เรียกใช้คำสั่ง PowerShell จากภายในnode_modulesไดเร็กทอรีหลัก:

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

สิ่งนี้เป็นการสร้าง package.json ที่ว่างเปล่าปลอมโดยเรียกร้องnpm pruneให้ลบทุกอย่างใน node_modules คืนค่า package.json เดิมและติดตั้งทุกอย่างใหม่

วิธีแก้ปัญหาอื่น ๆ บางอย่างอาจดูหรูหรากว่า แต่ฉันสงสัยว่าจะเร็วกว่าและละเอียดถี่ถ้วน ในเธรดอื่นฉันเคยเห็นคนแนะนำให้ลบไดเร็กทอรี node_modules แต่อย่างน้อยสำหรับ windows สิ่งนี้ทำให้ npm สำลักในภายหลังเนื่องจากไดเร็กทอรี bin หายไป บางทีบน linux จะได้รับการกู้คืนอย่างถูกต้อง แต่ไม่ใช่ windows


1
ในกรณีของฉัน - ฉันไม่ต้องการ package.json ที่มีอยู่แล้ว (เนื่องจากเรียกใช้สคริปต์ใน CI หลังจากเรียกใช้สคริปต์ npm แล้ว .. ) ดังนั้นฉันจึงใช้: "echo {}> package.json & npm prune"
Rikki

5

จริงๆแล้วไม่มีตัวเลือกให้ทำเช่นนั้นหากคุณต้องการถอนการติดตั้งแพ็คเกจจากpackage.jsonเพียงแค่ทำnpm lsในไดเร็กทอรีเดียวกับที่package.jsonอาศัยและใช้งานnpm uninstall <name>หรือnpm rm <name>สำหรับแพ็คเกจที่คุณต้องการลบ


8
ฉันรู้วิธีลบทีละรายการ - มันจะสมเหตุสมผลกว่านี้ถ้ามีคำสั่งให้รันกับไฟล์ package.json ในลักษณะเดียวกับการติดตั้ง npm
qodeninja

ไม่เราไม่ต้องการถอนการติดตั้งด้วยมือทุกโมดูล
shinzou

1
  1. ลบการอ้างอิงที่ไม่ต้องการออกจากpackage.json
  2. npm i

" npm i" จะไม่เพียงติดตั้ง deps ที่หายไปเท่านั้น แต่ยังอัปเดต node_modules ให้ตรงกับ package.json


1

( อย่าทำซ้ำขั้นตอนเหล่านี้จนกว่าคุณจะอ่านทุกอย่าง )

สำหรับฉันวิธีแก้ปัญหาที่กล่าวมาทั้งหมดไม่ได้ผล ซูฉันไป/usr/libวิ่งที่นั่น

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

แต่มันยังลบnpmแพ็คเกจออกและมีเพียงครึ่งหนึ่งของแพ็คเกจ (จนกว่าจะถึงตัวอักษร n)

ดังนั้นฉันจึงพยายามติดตั้งโหนดอีกครั้งโดยคู่มือโหนด

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

แต่มันไม่ได้ติดตั้งnpmอีกครั้ง

ดังนั้นฉันจึงตัดสินใจติดตั้งโหนดทั้งหมดใหม่ sudo apt-get remove nodejs และติดตั้งอีกครั้งตามคำแนะนำด้านบน

ขณะนี้ NPM ทำงานอีกครั้ง แต่โมดูลส่วนกลางยังคงอยู่ที่นั่น ดังนั้นฉันจะตรวจสอบเนื้อหาของไดเรกทอรีและดูเหมือนว่าสิ่งที่สำคัญเฉพาะที่นี่คือ/usr/lib/node_modules npmดังนั้นฉันจึงแก้ไขคำสั่งด้านบนเพื่อถอนการติดตั้งทุกอย่างยกเว้นnpm

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

@มันออกโมดูลทั้งหมดสิ่งที่ไม่ได้ถูกนำหน้า ซูฉันขยายลูปสำหรับไดเรกทอรีย่อย

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_modulesตอนนี้ของฉันมีเฉพาะnpmแพ็คเกจที่เชื่อมโยงกัน


1

อีกทางเลือกง่าย ๆ คือการลบ node_modules และ package-lock.json

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

หลังจากนี้คุณสามารถลองติดตั้งแพ็คเกจ npm ใหม่ได้


ขอบคุณสำหรับคำแนะนำนี้ ฉันไม่มีแพ็คเกจทั่วโลก คำตอบส่วนใหญ่กำลังพูดถึงตัวเลือก -g! ฉันมีช่วงเวลาที่น่าสยดสยองในการกำจัดแพ็คเกจโลคัลทั้งหมดเนื่องจากไม่ทราบเกี่ยวกับ nodejs / npm มากพอฉันจึง 'npm ติดตั้งสิ่งนี้และสิ่งนั้น' จากไดเรกทอรีต่างๆ เมื่อฉันใช้ 'npm uninstall <anything>' 'npm ls' ยังคงแสดงแพ็คเกจบางอย่าง ฉันเป็นโปรแกรมเมอร์เชลล์จึงพยายาม 'ถอนการติดตั้ง npm' ในทุกส่วนเท่าที่จะเป็นไปได้ของเอาต์พุต 'npm ls' ไม่มีการกำจัดแพ็คเกจทั้งหมด เหนื่อย แต่พบคำแนะนำนี้และแก้ไขปัญหาของฉันได้ใน 5 นาที ขอบคุณรุนแรง
BReddy

ฉันไม่รู้ว่าจุดประสงค์ของ package.json, package-lock.json, node_modules, การอ้างอิง, ความแตกต่างในพื้นที่ / ส่วนกลางหรือวิธีการทำงานของ nodejs / npm ฉันใช้โมดูล nodejs ที่จำเป็นสำหรับโปรแกรมอื่น เนื่องจากฉันติดตั้งโมดูลที่แตกต่างกันจำนวนมากด้วย 'npm install' จากไดเร็กทอรีที่แตกต่างกันฉันจึงต้องการกำจัดทั้งหมดในครั้งเดียว ไม่มีคำตอบอื่นใดที่พูดถึงเรื่องนี้ การใช้คำสั่งนี้และ 'find' บน linux ฉันสามารถกำจัดทุกอย่างได้ภายใน 5 นาที ไม่รู้ว่าทำไมยังไม่มีใครคิดว่าสิ่งนี้เป็นประโยชน์
BReddy

0

แม้ว่าคุณจะไม่จำเป็นต้องเรียกใช้ลูปสำหรับสิ่งนั้น

คุณสามารถลบ node_modules ทั้งหมดโดยใช้คำสั่งเดียว: -

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


0

Piggy-backing จากVIKAS KOHLIและjedmaoคุณสามารถทำได้

เวอร์ชันบรรทัดเดียว:

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

รุ่นหลายเส้น:

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' ' '`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.