पैकेज में अप्रयुक्त npm संकुल खोजें। json


231

क्या यह निर्धारित करने का कोई तरीका है कि क्या आपके पैकेज में पैकेज हैं। जेसन फ़ाइल जो अब आवश्यक नहीं है?

उदाहरण के लिए, जब कोई पैकेज आज़माता है और बाद में टिप्पणी करता है या कोड हटा रहा होता है, लेकिन इसे अनइंस्टॉल करना भूल जाता है, तो मैं कुछ ऐसे पैकेजों को समाप्त करता हूं जिन्हें हटाया जा सकता है।

यदि पैकेज सुरक्षित रूप से हटाया जा सकता है तो यह निर्धारित करने का एक प्रभावी तरीका क्या होगा?

जवाबों:


258

आप एक npm मॉड्यूल का उपयोग कर सकते हैं जिसे डिपचेक कहा जाता है (इसके लिए कम से कम 10 संस्करण की आवश्यकता है)।

  1. मॉड्यूल स्थापित करें:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. इसे चलाएं और अप्रयुक्त निर्भरता खोजें:

    depcheck

इस दृष्टिकोण के बारे में अच्छी बात यह है कि आपको findया grepकमांड को याद रखने की आवश्यकता नहीं है ।

उपयोग npx स्थापित किए बिना चलाने के लिए :

npx depcheck

11
depcheck-es6 को अब depcheck
cyberwombat

47
उपयोगी नहीं दिखता है। मैं मानक कोणीय 2 क्लि सेटअप का उपयोग कर रहा हूं और depcheckहर पैकेज को सूचीबद्ध करता unused
हूं

5
एनबी। depcheck पैकेजों में निर्दिष्ट स्क्रिप्ट में उपयोग किए गए पैकेज पैकेजों में नहीं लेता है। Json
Javier Arias

17
इसे सिर्फ एक बार चलाने के लिए (w / o इंस्टॉलेशन) - npx का उपयोग करें :npx depcheck
Kiril

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

131

एक पैकेज भी कहा जाता है npm-check:

NPM की जांच

पुरानी, ​​गलत और अप्रयुक्त निर्भरता के लिए जाँच करें।

यहां छवि विवरण दर्ज करें

यह काफी शक्तिशाली और सक्रिय रूप से विकसित है। इसकी सुविधाओं में से एक यह अप्रयुक्त निर्भरता के लिए जाँच है - इस भाग के लिए यह depcheckअन्य उत्तर में वर्णित मॉड्यूल का उपयोग करता है ।


8
मुझे depcheck के रूप में एक ही परिणाम देने के लिए लगता है। ऐसा लगता है कि यह अप्रयुक्त निर्भरताओं को खोजने के लिए भी depcheck का उपयोग करता है।
एलेक्स के

3
npm outdatedचेक, वर्तमान, वांछित और नवीनतम पैकेज संस्करण सूचीबद्ध करता है। हालांकि अप्रयुक्त पैकेजों की कोई सूची नहीं।
mgarde

1
उपयोगी नहीं दिखता है। मैं मानक कोणीय सेटअप का उपयोग कर रहा हूं और यह हर पैकेज को अप्रयुक्त के रूप में सूचीबद्ध करता है जो कि गलत है
काइल बर्कट

5

यदि आप OS (लिनक्स, OSX, आदि) की तरह एक यूनिक्स का उपयोग कर रहे हैं, तो आप अपने पैकेज के नाम वाले बयानों की आवश्यकता के लिए संयोजन findऔर egrepखोज कर सकते हैं :

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;

यदि आप पूरे require('name-of-package')विवरण को खोजते हैं , तो सही प्रकार के उद्धरण चिह्नों का उपयोग करना याद रखें:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;

या

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;

नकारात्मक पक्ष यह है कि यह पूरी तरह से स्वचालित नहीं है, अर्थात यह पैकेज के नामों को नहीं निकालता है package.jsonऔर उन्हें जांचता है। आपको प्रत्येक पैकेज के लिए यह करने की आवश्यकता है। चूँकि package.jsonसिर्फ JSON है इसलिए इसे एक छोटी सी स्क्रिप्ट लिखकर प्रेषित किया जा सकता है जो child_process.execप्रत्येक निर्भरता के लिए इस कमांड को चलाने के लिए उपयोग करता है। और इसे एक मॉड्यूल बनाते हैं। और इसे एनपीएम रेपो में जोड़ें ...


.jsxफ़ाइलों और .tsफ़ाइलों आदि के बारे में क्या : D
OZZIE

1
इस दृष्टिकोण का उपयोग करते हुए हम अपने रिएक्ट ऐप में प्रतिक्रिया मॉड्यूल का उपयोग नहीं कर रहे हैं: D
OZZIE

4

fiskeben ने लिखा है:

नकारात्मक पक्ष यह है कि यह पूरी तरह से स्वचालित नहीं है, अर्थात यह पैकेज के नाम से पैकेज नाम नहीं निकालता है और उन्हें जांचता है। आपको प्रत्येक पैकेज के लिए यह करने की आवश्यकता है।

यदि depcheckठीक से काम नहीं कर रहा है तो आइए फ़िस्बेन के उत्तर को स्वचालित बनाएं ! (उदाहरण के लिए मैंने इसे टाइपस्क्रिप्ट के साथ आज़माया और इसने अनावश्यक पार्सिंग त्रुटियाँ दीं)

पार्सिंग के लिए package.jsonहम सॉफ्टवेयर का उपयोग कर सकते हैं jq। नीचे की शेल स्क्रिप्ट के लिए एक निर्देशिका नाम की आवश्यकता होती है जहां से शुरू करें।

#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME

FILES=$(mktemp)
PACKAGES=$(mktemp)

find . \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES

    echo "--------------------------"
    echo "Checking $1..."
    while read PACKAGE
    do
        RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    done < $PACKAGES
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

पहले यह दो अस्थायी फाइलें बनाता है जहां हम पैकेज के नाम और फाइलों को कैश कर सकते हैं।

यह findकमांड से शुरू होता है । पहली और दूसरी पंक्ति इसे node_modulesऔर buildफ़ोल्डरों (या जो भी आप चाहते हैं) को अनदेखा करती है । तीसरी पंक्ति में अनुमत एक्सटेंशन शामिल हैं, आप यहां अधिक जोड़ सकते हैं जैसे JSX या JSON फाइलें।

एक फ़ंक्शन भरोसेमंद प्रकार पढ़ेगा।

पहले यह catएस package.json। फिर, jqआवश्यक निर्भरता समूह प्राप्त करता है। ( {} +ऐसा इसलिए है कि अगर फ़ाइल में कोई सहकर्मी निर्भरता नहीं हैं, तो यह एक त्रुटि नहीं करेगा।

उसके बाद, sedउद्धरण, पैकेज नाम के बीच के हिस्सों को निकालता है। -nऔर .../pयह मिलान भागों को मुद्रित करने के लिए कहता है और jqJSON आउटपुट से और कुछ नहीं । फिर हम पैकेज नामों की इस सूची को एक whileलूप में पढ़ते हैं ।

RESउद्धरण में पैकेज के नाम की घटनाओं की संख्या है। अभी यह import/ require... 'package'/ है "package"। यह ज्यादातर मामलों के लिए काम करता है।

फिर हम केवल परिणाम पंक्तियों की संख्या की गणना करते हैं फिर परिणाम प्रिंट करते हैं।

चेतावनियां:

  • विभिन्न आयातों में फाइलें नहीं मिलेंगी जैसे tsconfig.jsonफाइलें (lib विकल्प)
  • आपको grepकेवल ^USEDऔर UNUSEDफ़ाइलों के लिए मैन्युअल रूप से करना होगा ।
  • यह बड़ी परियोजनाओं के लिए धीमी है - शेल स्क्रिप्ट अक्सर अच्छे पैमाने पर नहीं होती हैं। लेकिन उम्मीद है कि आप इसे कई बार नहीं करेंगे।

1
संपादक कभी-कभी आयात को कई लाइनों में लपेटने का कारण बनते हैं। क्या यह स्क्रिप्ट उन कथनों को पकड़ लेगी जहां '' आयात 'या' आवश्यकता '' '' PACKAGE_NAME '' से अलग रेखा पर होगी? दूसरे शब्दों में, क्या यह आयात में व्हाट्सएप को अनदेखा करता है या बयान की आवश्यकता है?
vdiaz1130

1

हम इस उद्देश्य के लिए नीचे npm मॉड्यूल का उपयोग कर सकते हैं:

https://www.npmjs.com/package/npm-check-unused


यह पता चला है कि कुछ लोगों ने इस्तेमाल नहीं किया है, लेकिन यह भी इस्तेमाल किया है, फिर भी उपयोगी मुझे लगता है :-) यह समझ में नहीं आता है webpack लोडर ;-)
OZZIE

1

यहाँ कई उत्तर हैं कि अप्रयुक्त वस्तुओं को कैसे खोजना है।

मैं उन्हें अपने आप हटाना चाहता था ।

  1. इस नोड परियोजना को स्थापित करें।

    $ npm install -g typescript tslint tslint-etc


  1. रूट dir पर, एक नई फ़ाइल tslint-imports.json जोड़ें

    { "extends": [ "tslint-etc" ], "rules": { "no-unused-declaration": true } }


  1. इसे अपने जोखिम पर चलाएं, एक बैकअप बनाएं :)

    $ tslint --config tslint-imports.json --fix --project .


लेकिन यह केवल js फ़ाइलों से निकालने जा रहा है। लेकिन फिर भी अच्छा है।
अयोन नाहियन

कैसे के बारे मेंnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.