Npm.js में अप्रयुक्त संकुल को अनइंस्टॉल या प्रून करने के लिए npm कमांड


414

क्या Node.js प्रोजेक्ट से सभी अप्रयुक्त (अघोषित) निर्भरता को अनइंस्टॉल करने का एक तरीका है (जो अब मेरे में परिभाषित नहीं हैं package.json।) जब मैं अपने आवेदन को अपडेट करता हूं तो मुझे लगता है कि अप्रयुक्त पैकेजों को स्वतः हटा दिया जाना पसंद है।


1
किस चीज से अप्रयुक्त? node_modulesजब आप संबंधित से हटाए जाते हैं, तो क्या आप फ़ोल्डर्स को हटाने से मतलब रखते हैं package.json?
श्लोक २

1
ठीक है, mhm npm ll पहले से ही एक अच्छा संकेत देता है जो उम्मीदवार हैं।
टेरियन २

जवाबों:


670

नोट : हाल के npmसंस्करण पैकेज-लॉक सक्षम होने पर स्वचालित रूप से ऐसा करते हैं, इसलिए --productionध्वज के साथ विकास पैकेजों को हटाने के अलावा यह आवश्यक नहीं है ।


npm pruneमें सूचीबद्ध नहीं किए गए मॉड्यूल को निकालने के लिए चलाएँ package.json

से npm help prune:

यह कमांड "एक्सट्रॉनिक" पैकेज हटाता है। यदि पैकेज नाम प्रदान किया जाता है, तो केवल आपूर्ति किए गए नामों में से एक से मेल खाने वाले पैकेज हटा दिए जाते हैं।

बाहरी पैकेज वे पैकेज होते हैं जो मूल पैकेज की निर्भरता सूची में सूचीबद्ध नहीं होते हैं।

यदि --productionध्वज निर्दिष्ट किया गया है, तो यह कमांड आपकी देवनिर्भरता में निर्दिष्ट पैकेजों को हटा देगा।


3
अगर मैं इसे सही ढंग से पढ़ता हूं, तो यह सभी उप-निर्भरता को हटा देगा, क्योंकि वे सूचीबद्ध नहीं हैं package.json। क्या वह सही है? इसलिए, अगले अपडेट या इंस्टॉल को उन्हें फिर से स्थापित करना होगा।
nshew

1
हां, यह उप-निर्भरता को हटा देगा। उप-निर्भरताएं वास्तव में मॉड्यूल की अपनी node_modulesनिर्देशिका के अंदर संग्रहीत होती हैं , इसलिए उन्हें मॉड्यूल के साथ हटा दिया जाता है।
डार्कहॉग

2
मुझे एक उदाहरण देने दें। मैं अपने से कर्म हटाता हूं package.json, लेकिन बोवर छोड़ देता हूं । जब मैं दौड़ता हूं npm prune, तो मुझे उम्मीद है कि कर्म के सभी, अपने स्वयं के node_modulesफ़ोल्डर में, जिसमें इसकी निर्भरताएं हैं, हटाए जाएंगे। बावर की निर्भरता के बारे में क्या है (बोवर-जोंस, बोवर-लॉगर, चामोदर, फ्लेस्टेर, ग्लोब, एट अल।)। तकनीकी रूप से, वे मेरे प्रोजेक्ट में सूचीबद्ध नहीं हैं package.json। उन्हें हटाया जाता है या नहीं?
भतीजे

3
नहीं, वे नहीं हैं। ध्यान दें कि वे आपके खुद के नहीं हैं node_modules, लेकिन अंदर से node_modules/bower/node_modules , "संरक्षित" द्वारा node_modules/bower/package.json। आपके पैकेज की निर्भरता और आपके पैकेज की निर्भरता मिश्रित नहीं हैं
डार्कहॉग

2
और npm इंस्टॉल होने से पहले अपने सिक्रेटवैप को हटा दें, उपरोक्त निर्देशों में होना चाहिए था।
एंडी रे

306

यदि आप ऐसा करने के लिए कुछ मिनट के समय के बारे में चिंतित नहीं हैं, तो एक समाधान होगा rm -rf node_modulesऔर npm installस्थानीय मॉड्यूल को फिर से बनाना होगा।


93
यह अच्छा होगा यदि लोग टिप्पणी के बिना इसे रोकते हैं .. यह स्वीकृत उत्तर के विकल्प के रूप में एक नोड परियोजना निर्भरता को रीसेट करने की एक वैध रणनीति है। यदि आपने एक नोड_मॉड्यूल्स उप-निर्देशिका सामग्री (सिम्पल-लिंक्ड निर्भरताओं के साथ करना आसान) को क्षतिग्रस्त कर दिया है या यदि आपके पास नोड या एनपीएम संस्करण धक्कों जैसे अतिरिक्त परिवर्तन हैं, तो प्रॉम्प्ट से नोड_मॉडल फ़ोल्डर को ठीक से साफ नहीं किया जाएगा, लेकिन यह उत्तर होगा।

41
पुनर्निर्माण node_modulesभी पुष्टि करता है कि package.jsonफ़ाइल एक प्रतिलिपि प्रस्तुत करने योग्य निर्भरता ग्राफ का वर्णन करती है। अपने को हटाना और फिर से स्थापित करना node_modulesमूल रूप से एक तैनात परीक्षा है।
जोमलर

2
@joemaller जरूरी नहीं कि ज्यादातर परिनियोजन वर्कफ्लो में निहित या स्पष्ट रूप से किसी प्रकार का कैश हो। यदि एक पैकेज पहले से ही स्थापित है और विनिर्देश फिट बैठता है, तो इसे रखा जाता है। हटाने पर फिर से मिलान करने से उस पैकेज को नवीनतम संस्करण से टक्कर मिलेगी।
डार्कहॉग

7
npm pruneएक iota की मदद नहीं की, लेकिन यह किया। मेरी समस्या एक टूटी हुई सहानुभूति थी।
इरिक बिर्कलैंड

8
कई गैर-आदर्श परिस्थितियों में जो वर्तमान में npm के साथ संभव है। यह भी सवाल निश्चित रूप से दोहराया काम या अतिरिक्त लाने पर कुछ बाधाएं निर्दिष्ट नहीं किया, बस कैसे अंतिम लक्ष्य को प्राप्त करने के लिए। यह उत्तर उस प्रश्न को संतुष्ट करता है, जो उस लक्ष्य से परे अन्य लोग चाहते हैं।
Pyrce

10

आप बाहरी पैकेजों को हटाने के लिए npm-prune का उपयोग कर सकते हैं ।

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

यह कमांड "एक्सट्रॉनिक" पैकेज हटाता है। यदि पैकेज नाम प्रदान किया जाता है, तो केवल आपूर्ति किए गए नामों में से एक से मेल खाने वाले पैकेज हटा दिए जाते हैं।

बाहरी पैकेज वे पैकेज होते हैं जो मूल पैकेज की निर्भरता सूची में सूचीबद्ध नहीं होते हैं।

यदि -प्रोडक्शन ध्वज निर्दिष्ट किया गया है या NODE_ENV पर्यावरण चर उत्पादन के लिए सेट किया गया है , तो यह कमांड आपके देवनिर्भरता में निर्दिष्ट संकुल को हटा देगा । स्थापना --no-उत्पादन नकारना होगा NODE_ENV करने के लिए सेट किया जा रहा उत्पादन

यदि -dry-run ध्वज का उपयोग किया जाता है, तो वास्तव में कोई परिवर्तन नहीं किया जाएगा।

यदि --json ध्वज का उपयोग किया जाता है तो परिवर्तन किए गए npm prune (या --dry-run के साथ किए गए ) JSON ऑब्जेक्ट के रूप में मुद्रित किए जाते हैं।

पैकेज-लॉक के साथ सामान्य संचालन में सक्षम होने पर, बाहरी मॉड्यूल स्वचालित रूप से छंट जाते हैं जब मॉड्यूल स्थापित होते हैं और आपको केवल -प्रोडक्शन ध्वज के साथ इस कमांड की आवश्यकता होगी ।

यदि आपने पैकेज-लॉक को अक्षम कर दिया है, तो बाहरी मॉड्यूल को हटाया नहीं जाएगा और उन्हें हटाने के लिए समय-समय पर npm prune चलाने के लिए आप पर निर्भर है ।

नक़ल कम करने के लिए 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

नोड के मॉड्यूल लुकअप के पदानुक्रमित प्रकृति के कारण, बी और डी दोनों को पेड़ के मूल स्तर पर एकल सी पैकेज से मिले उनकी निर्भरता मिलेगी।

समर्पण एल्गोरिथ्म पेड़ चलता है, प्रत्येक निर्भरता को जहां तक ​​संभव हो पेड़ में ऊपर की ओर बढ़ रहा है, भले ही डुप्लिकेट न मिले। यह एक सपाट और कटे-फटे पेड़ के रूप में परिणत होगा।


Npm dedupe चलाने के बाद मेरे नोड_मॉडल फ़ोल्डर में अधिक आइटम हैं । आह!
नेविल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.