2025, Oct 21 01:31
Pelican बिल्ड minify() पर TypeError? ऐसे ठीक करें
निर्भरता अपडेट के बाद Pelican बिल्ड minify-html पर TypeError देता है? pelican/plugins/minify.py में पैरामीटर नाम अपडेट करें और बिना डाउनग्रेड जल्दी फिक्स पाएं.
निर्भरताएँ अपडेट करने के बाद, भले ही आपके कंटेंट में कुछ न बदला हो, साइट जनरेशन के दौरान Pelican अचानक फेल हो सकता है। एक सामान्य उदाहरण है मिनिफिकेशन चरण पर TypeError के साथ क्रैश, जो unexpected keyword arguments की ओर संकेत करता है। यदि आपका बिल्ड output/archives.html जैसे किसी HTML पर रुक जाता है और स्टैक minify() से जुड़े संदेश पर समाप्त होता है, तो संभव है कि आप minify-html में हाल का एक breaking change हिट कर रहे हों।
CRITICAL Exception: Unable to minify file output\archives.html. Exception was: TypeError("minify() got an unexpected keyword argument 'do_not_minify_doctype'")
फेल होती कॉल को पुनः बनाना
इस परिदृश्य में समस्या Pelican के minify प्लगइन के भीतर है। minify-html को जाने वाली कॉल ऐसे आर्गुमेंट नामों का उपयोग करती है जो breaking change के बाद अब मौजूद नहीं हैं। तर्क सरल है: HTML को minify_html.minify के माध्यम से भेजना, CSS और JS मिनिफिकेशन फ्लैग्स के साथ, और doctype तथा एट्रिब्यूट्स के बीच की स्पेसिंग को बनाए रखना। समस्या वाला संस्करण कुछ इस तरह दिखता है:
def compress_markup(self, html_blob, shrink_css, shrink_js):
    return minify_html.minify(
        html_blob,
        do_not_minify_doctype=True,
        keep_spaces_between_attributes=True,
        minify_css=shrink_css,
        minify_js=shrink_js,
    )
असल में दिक्कत क्या है
minify-html लाइब्रेरी ने एक breaking change पेश किया (देखें 0.16.0 नोट्स)। कीवर्ड आर्गुमेंट्स do_not_minify_doctype और keep_spaces_between_attributes हटा दिए गए और उनके स्थान पर नए नाम आए। नतीजतन, पुराने कॉलर्स ऐसे नाम पास करते हैं जिन्हें फ़ंक्शन अब स्वीकार नहीं करता, और Python unexpected keyword arguments के लिए TypeError उठाता है। Pelican प्लगइन अभी भी पुराने नामों का इस्तेमाल करता है, इसलिए असल वजह minify-html के API बदलाव होने के बावजूद विफलता Pelican में दिखती है।
यदि आप अपने प्रोजेक्ट में 'Unable to minify file' टेक्स्ट खोजते हैं, तो कॉल चेन आपको minify-html के बजाय Pelican के भीतर मिलेगी। संबंधित कोड पाथ pelican\plugins\minify\minify.py में है।
समाधान
कॉल साइट को नए पैरामीटर नामों और समतुल्य अर्थों के साथ अपडेट करें। उद्देश्य वही है: CSS और JS को चाहें तो मिनिफाई करें, लेकिन doctype को सुरक्षित रखें और एट्रिब्यूट्स के बीच की स्पेस बरकरार रखें। संशोधित कॉल नए पैरामीटर्स minify_doctype और allow_removing_spaces_between_attributes से मैप होती है, जहाँ वही व्यवहार पाने के लिए बूलियन मान उल्टे (inverted) रखने पड़ते हैं।
def compress_markup(self, html_blob, shrink_css, shrink_js):
    return minify_html.minify(
        html_blob,
        minify_doctype=False,
        allow_removing_spaces_between_attributes=False,
        minify_css=shrink_css,
        minify_js=shrink_js,
    )
यह क्यों महत्वपूर्ण है
स्टैटिक साइट बिल्ड्स का व्यवहार पूर्वानुमेय होना चाहिए। जब ट्रांजिटिव निर्भरताएँ breaking changes लाती हैं, तो असफलताएँ ऐसे हिस्सों में उभरती हैं जो बदलाव से असंबंधित लगते हैं, जिससे डिबगिंग मुश्किल हो जाती है। यह पहचानना कि एरर टेक्स्ट unexpected keyword argument का संदर्भ देता है, और यह जानना कि minify कॉल कहाँ से आती है, आपको बिना डाउनग्रेड किए जल्दी समाधान तक पहुँचने में मदद करता है।
यह भी याद दिलाता है कि पहले कॉल करने वाले हिस्से की जाँच करें। Pelican के भीतर 'Unable to minify file' खोजने पर आप सीधा minify प्लगइन तक पहुँचते हैं, जहाँ आप आर्गुमेंट नामों को मौजूदा minify-html API के साथ संरेखित कर सकते हैं।
मुख्य बातें
यदि निर्भरताएँ अपडेट करने के बाद Pelican minify() पर TypeError के साथ बंद हो जाता है, तो pelican\plugins\minify\minify.py में पुराने आर्गुमेंट नाम खोजें। do_not_minify_doctype को minify_doctype=False से और keep_spaces_between_attributes को allow_removing_spaces_between_attributes=False से बदलें, जबकि CSS और JS फ्लैग्स जैसे हैं वैसे ही रखें। इससे मूल व्यवहार बरकरार रहता है और पुराने पैकेज पिन किए बिना साफ-सुथरा बिल्ड फिर से होने लगता है।