คำสั่ง npm เพื่อถอนการติดตั้งหรือตัดแพ็คเกจที่ไม่ได้ใช้ใน Node.js


414

มีวิธีการเพียงถอนการติดตั้งการอ้างอิงที่ไม่ได้ใช้ (ไม่ได้ประกาศ) ทั้งหมดจากโครงการ Node.js (รายการที่ไม่ได้กำหนดไว้ในของฉันอีกต่อไปpackage.json) เมื่อฉันอัปเดตแอปพลิเคชันของฉัน


1
ไม่ได้ใช้อะไร คุณหมายถึงการลบโฟลเดอร์ออกnode_modulesเมื่อพวกมันถูกลบออกจากโฟลเดอร์นั้นpackage.jsonหรือไม่?
slaks

1
แน่นอนว่า mhm npm จะให้คำแนะนำที่ดีซึ่งก็คือผู้สมัคร
Tarion

คำตอบ:


670

หมายเหตุ : npmเวอร์ชันล่าสุดทำสิ่งนี้โดยอัตโนมัติเมื่อเปิดใช้งานการล็อกแพ็กเกจดังนั้นจึงไม่จำเป็นยกเว้นการลบแพ็กเกจการพัฒนาด้วย--productionแฟล็ก


เรียกใช้ในการลบโมดูลไม่ได้ระบุไว้ในnpm prunepackage.json

จากnpm help prune:

คำสั่งนี้จะลบแพ็คเกจ "ภายนอก" หากระบุชื่อแพ็กเกจแพ็กเกจที่ตรงกับหนึ่งในชื่อที่ระบุจะถูกลบออก

แพ็คเกจภายนอกคือแพ็คเกจที่ไม่ปรากฏในรายการการอ้างอิงของแพ็คเกจหลัก

หาก--productionระบุแฟล็กคำสั่งนี้จะลบแพ็กเกจที่ระบุใน devDependencies ของคุณ


3
package.jsonถ้าผมอ่านที่ถูกต้องนี้จะลบย่อยอ้างอิงทั้งหมดเนื่องจากพวกเขาไม่ได้ระบุไว้ใน นั่นถูกต้องใช่ไหม? ดังนั้นการปรับปรุงหรือติดตั้งครั้งต่อไปจะต้องติดตั้งใหม่
nshew

1
ใช่มันจะลบการอ้างอิงย่อย การพึ่งพาย่อยจะถูกจัดเก็บจริงภายในnode_modulesไดเรกทอรีของโมดูลดังนั้นพวกเขาจะถูกลบออกพร้อมกับโมดูล
Darkhogg

2
ขอยกตัวอย่าง ฉันลบกรรมออกจากของฉันpackage.jsonได้ เมื่อฉันวิ่งnpm pruneฉันคาดหวังว่ากรรมทั้งหมดรวมถึงnode_modulesโฟลเดอร์ของตัวเองที่มีการอ้างอิงจะถูกลบออก แล้วเรื่องการพึ่งพาของ bower (bower-json, bower-logger, chmodr, fstream, glob, et al.) package.jsonเทคนิคเหล่านี้จะไม่ได้ระบุไว้ในโครงการของฉัน สิ่งเหล่านั้นถูกลบออกหรือไม่?
nshew

3
ไม่พวกเขาไม่ได้เป็น. หมายเหตุว่าพวกเขากำลังไม่ได้ในของคุณเองnode_modulesแต่ภายใน node_modules/bower/node_modules "การป้องกัน" node_modules/bower/package.jsonโดย การขึ้นต่อกันของแพ็กเกจของคุณและการขึ้นต่อกันของแพ็กเกจของคุณนั้นไม่ได้ปะปนกัน
Darkhogg

2
และลบตัวย่อของคุณก่อนการติดตั้ง npm ควรทำตามคำแนะนำด้านบน
Andy Ray

306

หากคุณไม่กังวลเกี่ยวกับการทำเช่นนั้นสักสองสามนาทีการแก้ปัญหาจะทำrm -rf node_modulesและnpm installอีกครั้งเพื่อสร้างโมดูลท้องถิ่น


93
มันจะดีถ้าคนหยุดการลงคะแนนโดยไม่มีความคิดเห็น .. มันเป็นกลยุทธ์ที่ถูกต้องในการรีเซ็ตการพึ่งพาโครงการโหนดเป็นทางเลือกแทนคำตอบที่ได้รับการยอมรับ หากคุณสร้างความเสียหายเนื้อหาไดเรกทอรีย่อย node_modules (ง่ายต่อการพึ่งพาการเชื่อมโยง sym) หรือหากคุณมีการเปลี่ยนแปลงเพิ่มเติมเช่นการตัดพรุนโหนดหรือ npm เวอร์ชันการตัดจะไม่ถูกต้องล้างโฟลเดอร์ node_modules แต่คำตอบนี้จะ
Pyrce

41
การสร้างใหม่node_modulesยังตรวจสอบpackage.jsonไฟล์อธิบายกราฟอ้างอิงที่ทำซ้ำได้ การลบและติดตั้งใหม่ของคุณnode_modulesนั้นเป็นการทดสอบการใช้งาน
joemaller

2
@joemaller ไม่จำเป็นว่าเวิร์กโฟลว์การปรับใช้ส่วนใหญ่มีแคชบางประเภทโดยปริยายหรืออย่างชัดเจน หากมีการติดตั้งแพคเกจไว้แล้วและเหมาะสมกับสเปคมันก็จะถูกเก็บไว้ การลบแล้วติดตั้งใหม่จะชนแพคเกจนั้นเป็นเวอร์ชันล่าสุดที่ตรงกัน
Darkhogg

7
npm pruneไม่ได้ช่วยสักนิด แต่ก็ทำได้ ปัญหาของฉันคือ symlink ที่ใช้งานไม่ได้
Eirik Birkeland

8
ภายใต้สถานการณ์ที่ไม่เหมาะเป็นอย่างมากซึ่งปัจจุบันไม่สามารถทำได้ด้วย npm คำถามก็ไม่ได้ระบุข้อ จำกัด บางประการเกี่ยวกับการทำงานซ้ำ ๆ หรือการดึงข้อมูลเพิ่มเติมเพียงวิธีการบรรลุเป้าหมายสุดท้าย คำตอบนี้ตรงกับคำถามตามที่ระบุไว้แม้ว่าสิ่งอื่น ๆ อาจต้องการเกินเป้าหมาย
Pyrce

10

คุณสามารถใช้npm-pruneเพื่อลบแพ็กเกจที่ไม่เกี่ยวข้อง

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

คำสั่งนี้จะลบแพ็คเกจ "ภายนอก" หากระบุชื่อแพ็กเกจแพ็กเกจที่ตรงกับหนึ่งในชื่อที่ระบุจะถูกลบออก

แพ็คเกจภายนอกคือแพ็คเกจที่ไม่ปรากฏในรายการการอ้างอิงของแพ็คเกจหลัก

หาก--productionธงมีการระบุหรือNODE_ENVตัวแปรสภาพแวดล้อมมีการตั้งค่าการผลิตคำสั่งนี้จะเอาแพคเกจที่กำหนดไว้ในของคุณdevDependencies การตั้งค่า--no-ผลิตจะลบล้างNODE_ENVเป็นชุดที่จะผลิต

หากมีการใช้แฟล็ก --dry-runจะไม่มีการเปลี่ยนแปลงใด ๆ

หากใช้แฟล็ก --jsonดังนั้นการเปลี่ยนแปลงการตัด npm (หรือจะทำกับ--dry-run ) จะถูกพิมพ์เป็นวัตถุ JSON

ในการดำเนินงานตามปกติกับแพคเกจล็อคเปิดใช้งานโมดูลภายนอกจะถูกตัดโดยอัตโนมัติเมื่อมีการติดตั้งโมดูลและคุณเท่านั้นที่จะต้องใช้คำสั่งนี้กับ--productionธง

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

ใช้ npm-dedupe เพื่อลดความซ้ำซ้อน

npm dedupe
npm ddp

ค้นหาแผนผังแพ็กเกจโลคัลและพยายามทำให้โครงสร้างโดยรวมง่ายขึ้นโดยย้ายการพึ่งพาขึ้นไปบนต้นไม้ซึ่งสามารถแบ่งใช้แพ็กเกจที่ขึ้นต่อกันหลายตัวได้อย่างมีประสิทธิภาพยิ่งขึ้น

ตัวอย่างเช่นพิจารณากราฟการพึ่งพานี้:

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

ในกรณีนี้npm-dedupeจะเปลี่ยนต้นไม้เป็น:

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

เนื่องจากลักษณะลำดับชั้นของการค้นหาโมดูลของโหนด b และ d ทั้งสองจะได้รับการพึ่งพาของพวกเขาพบโดยแพคเกจเดียวที่ระดับรากของต้นไม้

อัลกอริธึมการขจัดข้อมูลซ้ำซ้อนจะเดินบนต้นไม้โดยให้แต่ละการพึ่งพาอาศัยอยู่ไกลที่สุดเท่าที่จะเป็นไปได้แม้ว่าจะไม่พบข้อมูลซ้ำ ซึ่งจะส่งผลให้ทั้งต้นไม้แบนและ deduplicated


ฉันมีรายการเพิ่มเติมในโฟลเดอร์ node_modules หลังจากรัน npm dedupe เฮ้อ!
เนวิลล์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.