2012-05-25 17 views
6

मैं वर्तमान में लगभग 15 वर्षीय वेब एप्लिकेशन पर काम कर रहा हूं।सफाई विशाल पर्ल कोडबेस

यह एचटीएमएल :: खाका टेम्पलेट के साथ मुख्य रूप से सीजीआई पर्ल स्क्रिप्ट में शामिल है।

इसमें 12 000 से अधिक फ़ाइलें हैं और कुल कोड का लगभग 260 एमबी है। मेरा अनुमान है कि 1500 से अधिक पर्ल स्क्रिप्ट की आवश्यकता नहीं है और मैं सभी अप्रयुक्त कोड से छुटकारा पाना चाहता हूं।

कोड के लिए व्यावहारिक रूप से कोई परीक्षण नहीं लिखा गया है।

मेरे प्रश्न हैं:

  • आप किसी भी CPAN मॉड्यूल मदद कर सकते हैं मुझे केवल use घ और require घ मॉड्यूल की एक सूची प्राप्त के बारे में पता कर रहे हैं?
  • यदि आप सभी अतिरिक्त कोड से छुटकारा पाना चाहते हैं तो आपका दृष्टिकोण क्या होगा?

मैं निम्नलिखित तरीकों पर सोच रहा था:

  • कोशिश लोगों के साथ use और require पर्ल builtins ओवरराइड करने के लिए है कि उत्पादन एक विशिष्ट स्थान में लोड फ़ाइल नाम
  • ओवरराइड warnings और/या strict मॉड्यूल import विशिष्ट स्थान में फ़ाइल नाम को फ़ंक्शन और आउटपुट
  • Devel::Cover परल मॉड्यूल का अध्ययन करें और उसी दृष्टिकोण को लें और सी का विश्लेषण करें स्तोत्र जब मैनुअल परीक्षण के बजाय कर स्वचालित परीक्षण के
  • एक कस्टम, जो फ़ाइल में से प्रत्येक के नाम प्रवेश करेंगे इसे पढ़ता के साथ पर्ल निष्पादन की जगह lsof से कुछ रचनात्मक उपयोग
  • (मुझे लगता है कि अभी तक कैसे करना है पता नहीं है) (?!?)
+0

मेरा दृष्टिकोण किसी भी कोड को छूने से पहले परीक्षण लिखना शुरू करना होगा, जैसे कि हमेशा बड़े रखरखाव करते समय। –

+0

मेरा अनुमान है कि 80% कोड का उपयोग/आवश्यक नहीं है - यह पूरे कोड के लिए परीक्षण लिखने के लिए वित्तीय रूप से व्यवहार्य नहीं है। –

+1

@ ट्यूडर कॉन्स्टेंटिन - कोड के लिए यूनिट परीक्षण न लिखें। ऐप के उपयोग के मामलों के लिए कार्यात्मक परीक्षण लिखें। – DVK

उत्तर

5

Devel::Modlist आपको जो चाहिए वह दे सकता है, लेकिन मैंने इसका कभी भी उपयोग नहीं किया है।

इस तरह के कुछ करने के लिए मुझे कुछ बार करने की ज़रूरत है, मैंने प्रोग्राम के अंत में %INC का निरीक्षण करने के लिए अधिक क्रूर बल दृष्टिकोण का चयन किया है।

END { 
    open my $log_fh, ...; 
    print $log_fh "$_\n" for sort keys %INC; 
} 
+0

मीठा। $ 0 का एक फ़ंक्शन $ log_fh बनाएं और चीजों को थोड़ी देर के लिए चलाएं ... – gsiems

+0

ऐसा करने के एक से अधिक तरीके हैं - आपके दोनों तरीकों से मेरी ज़रूरत के लिए बिल्कुल सही लगता है। अभी मैं 'END {...}' दृष्टिकोण पर काम कर रहा हूं और यह आसानी से काम करता है - बड़ा धन्यवाद –

2

एक पहली सन्निकटन के रूप में, मैं बस

egrep -r '\<(use|require)\>' /path/to/source/* 

चलाने फिर कुछ दिनों के खर्च से उत्पादन को साफ करेंगे। इससे आपको इस्तेमाल या आवश्यक सभी मॉड्यूल की एक सूची मिल जाएगी।

आप कुछ लाइब्रेरी पथों को बाहर करने के लिए @INC के साथ भी खेल सकते हैं।

यदि आप निष्पादन पथ निर्धारित करने का प्रयास कर रहे हैं, तो आप डीबगर के माध्यम से 'ट्रेस' (यानी 'डी' डीबगर में 'टी' के साथ कोड चलाने में सक्षम हो सकते हैं, फिर आउटपुट को टेक्स्ट फ़ाइल में रीडायरेक्ट कर सकते हैं आगे के विश्लेषण। मुझे पता है कि CGI चलाते समय यह मुश्किल है ...

+0

से यह कोडबेस में सभी मॉड्यूल का उपयोग/आवश्यक होने के रूप में आउटपुट करेगा , क्योंकि एप्लिकेशन के पुराने संस्करण हैं जिन्हें फिर से लिखा गया है (कॉपी/पेस्ट फिर से लिखें)। मैं एप्लिकेशन के लिए कुछ प्रविष्टि बिंदु जानता हूं, शायद अगर मैं उन निर्भरताओं के लिए ग्राफ बनाता हूं और प्रविष्टि बिंदुओं से संबंधित सभी फ़ाइलों को निकालता हूं ..... –

+0

आह। तो आपके पास 12000 स्रोत फाइलें हैं, लेकिन आप नहीं जानते कि कौन से हैं या निष्पादित नहीं किए जा रहे हैं? –

+0

आपको अपने वेब सर्वर लॉग से अपने प्रवेश बिंदु निर्धारित करने में सक्षम होना चाहिए। फिर आप सूची में प्रत्येक फ़ाइल को पढ़ने के लिए एक छोटा मकड़ी लिखने पर विचार कर सकते हैं, और उपयोग की खोज कर सकते हैं और बयानों की आवश्यकता है। कुछ स्कोरबोर्ड या ग्राफ में प्रत्येक नई खोजी गई फ़ाइल को रिकॉर्ड करें, और इसे सूची में रखें, और सूची खाली होने तक जारी रखें। –

2

प्रासंगिक timestamps मान लिया जाये कि चालू हैं, आप विभिन्न स्क्रिप्ट फ़ाइलें पर पहुँच बार जांच कर सकता है - कि किसी भी शीर्ष स्तर के स्क्रिप्ट फ़ाइलें कि इस्तेमाल नहीं किया जा रहा से इनकार कर देना चाहिए।

क्या हो रहा है यह देखने के लिए वर्तमान स्क्रिप्ट-नाम ($ 0) लॉग करने के लिए CGI.pm को कुछ उपकरण जोड़ने के लायक हो सकता है।

+0

आपके उत्तर के लिए धन्यवाद - जांच के लायक - विशेष रूप से छवियों जैसे गैर पर्ल संसाधनों के लिए –