2011-11-01 11 views
34

द्वारा नोट किए गए मुद्दों को ठीक करना यह अच्छा है कि ghc-pkg check टूटे हुए पैकेज सूचीबद्ध करेगा, और वे क्यों टूटे हुए हैं। लेकिन जहां तक ​​मुझे पता है, उन टूटे हुए पैकेजों का ख्याल रखने के लिए कोई स्वचालित तरीका नहीं है। टूटे हुए पैकेजों से निपटने के लिए अनुशंसित तरीका क्या है? (पसंदीदा रूप से जीएचसी को पुनर्स्थापित नहीं करें)ghc-pkg चेक

+0

यह इस बात पर निर्भर करता है कि आपने अपने पैकेज कैसे इंस्टॉल किए हैं ... – ivanm

उत्तर

29

उम्मीद है कि आप अपने वैश्विक पैकेज डेटाबेस में किसी को तोड़ने के लिए पर्याप्त बुद्धिमान नहीं हैं। वहां ब्रेकेज का अर्थ आसानी से हो सकता है कि जीएचसी की पुनर्स्थापना आवश्यक है। तो, आइए मान लीजिए कि ब्रेकेज उपयोगकर्ता पैकेज डीबी तक सीमित है (संभवतः उपयोगकर्ता पैकेज द्वारा छायांकित वैश्विक में एक पैकेज या दो को छोड़कर)। केवल कुछ संकुल टूट रहे हैं, तो आप अपने सेटअप हमलावर संकुल पंजीकरण रद्द करके,

$ ghc-pkg unregister --user borken 

कि अक्सर शिकायत करते हैं जाएगा कि पंजीकरण रद्द Borken अन्य संकुल टूट जाएगा ठीक कर सकते हैं। चाहे आप --force के साथ तत्काल या अनधिकृत बोर्कन को तुरंत पंजीकरण करने का प्रयास करें और बाद में नए टूटे हुए सौदे से अधिकतर पसंद का मामला है। सुनिश्चित करें कि आप उपयोगकर्ता डीबी से केवल पैकेज को अनधिकृत कर दें। यदि चीजें बहुत गंभीर नहीं हैं, तो कुछ हद तक पैकेजों को अनधिकृत करने के बाद, ghc-pkg check कोई और टूटा पैकेज रिपोर्ट नहीं करेगा।
यदि दूसरी तरफ, पैकेजों का एक बड़ा हिस्सा टूटा हुआ है, तो उपयोगकर्ता डीबी, $ rm -rf ~/.ghc/ghc-version/package.conf.d या अन्य ओएस के बराबर पूरी तरह से सफाया करना संभव होगा।

किसी भी तरह से, आप उन पैकेजों को खो देंगे जो आप अभी भी उपयोग करना चाहते हैं, इसलिए आप उन्हें कुछ भी तोड़ने के बिना पुनर्स्थापित करने का प्रयास करेंगे।

$ cabal install world --dry-run 

कि सभी संकुल आप cabal-install के साथ स्थापित करने के लिए एक सुसंगत स्थापित योजना का उत्पादन करने की कोशिश करेंगे चलाएँ। यदि ऐसा करने में विफल रहता है, तो यह कारणों को प्रिंट करेगा, फिर आप विश्व फ़ाइल (~/.cabal/world) में सूचीबद्ध संकुल में बाधाओं को जोड़कर समस्याओं को ठीक करने में सक्षम हो सकते हैं - उदाहरण के लिए, हालांकि मेरे पास कोई टूटा पैकेज नहीं है (के अनुसार ghc/ghc-pkg), cabal install world --dry-run ने मुझे बताया कि यह vector-algorithms-0.5.2 को कॉन्फ़िगर नहीं कर सका, जो vector >= 0.6 && < 0.8 पर निर्भर करता है (मेरे पास vector-0.7.1 स्थापित है)। कारण यह है कि hmatrix-0.12.0.1 को vector >= 0.8 की आवश्यकता है। विश्व फ़ाइल में "< 0.12" द्वारा हैमट्रिक्स पर -any "बाधा" को प्रतिस्थापित करने से एक क्लीन इंस्टॉल-प्लान उत्पन्न हुआ।
तो, विश्व फ़ाइल में बाधाओं के साथ झुकाव के बाद, आपको कैबल से एक इंस्टॉल योजना मिल जाएगी। जांचें कि क्या आपके पास पहले से मौजूद किसी भी पैकेज को पुनर्स्थापित करना होगा (एक नया संस्करण स्थापित करना शायद ठीक है, उसी संस्करण को पुनर्स्थापित करने का मतलब परेशानी है)। यदि आप कैबल की इंस्टॉल-प्लान, cabal install world से खुश हैं और जीएचसी व्यस्त होने पर चाय का एक अच्छा पॉट बनाते हैं। एक बार फिर ghc-pkg check चलाएं, सभी को सत्यापित करने के लिए।

आम तौर पर अच्छी सलाह का एक टुकड़ा: यदि आपको नहीं पता कि पैकेज स्थापित करने में क्या इंस्टॉल होता है, तो हमेशा पहले - ड्रा-रन का उपयोग करें।

आप कबाल के साथ वैश्विक हुए इंस्टॉल करके अपने वैश्विक पैकेज डेटाबेस तोड़ दिया, तो पंजीकरण रद्द अपराधियों की रणनीति काम कर सकते हैं, लेकिन यह भी पूरी तरह अपने GHC, कि क्या जो रास्ते में टूट गया है पर निर्भर करता है टूट सकता है। यदि आपने अपने ओएस डिस्ट्रो से पैकेज इंस्टॉल करके अपना ग्लोबल डीबी तोड़ दिया है, तो एक नया जीएचसी स्थापित करें, डिस्ट्रो-पैकर्स को शाप दें, और ऐसी घटनाओं को रोकने में उनकी मदद करने की कोशिश करें।

cabal repair कमांड बहुत अच्छा होगा, लेकिन समय के लिए, एक टूटी हुई सेटअप की मरम्मत दुर्भाग्यवश बहुत अधिक काम है।

+0

वैश्विक पैकेज डेटाबेस को तोड़ने में क्या गड़बड़ है? यदि आप संकुल सिस्टम-व्यापी स्थापित कर रहे हैं (या तो पैकेज प्रबंधक के कारण या क्योंकि आप कई लोगों के लिए मशीनों का प्रबंधन कर रहे हैं और इस प्रकार वैश्विक रूप से पैकेज स्थापित करते हैं), तो यह केवल इसे ठीक करने का मामला है। हालांकि यह ** एक समस्या है जब बूट पैकेज टूट जाता है ... – ivanm

+0

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

+0

ठीक है, अगर आप कैबल-इंस्टाल का उपयोग करते हैं, तो बूट पैकेज प्रभावित हो सकते हैं ... लेकिन एक डिस्ट्रो पैकेज मैनेजर का उपयोग करके, यह कोई समस्या नहीं होनी चाहिए। – ivanm

15

कुछ समय के लिए मैंने इस ghc-pkg-clean script पर भरोसा किया है।यह सभी टूटे हुए पैकेज हटा देता है और मैं उन्हें आवश्यकतानुसार पुनर्स्थापित करता हूं। अधिक गंभीर टूटने के लिए, मैं ghc-pkg-reset script का उपयोग करता हूं।

आज, हालांकि, मुझे ghc-pkg-autofix मिला, जो इसे आगे बढ़ाता है - टूटे हुए पैकेज अखंड हो जाते हैं। मुझे नहीं पता कि यह क्या करता है, वाईएमएमवी।

+4

विवरण से और स्रोत पर एक संक्षिप्त रूप से, 'ghc-pkg-autofix'' ~/.ghc /.../ package.conf.d/package' में निर्भरता जानकारी को फिर से लिखता है। यह एक जोखिम भरा ऑपरेशन है, जो चीजों को कपटपूर्ण तरीके से तोड़ सकता है, लेकिन जहां यह काम करता है, यह तेज़ है। जैसा कि अवरोध कहता है, _ अपने जोखिम पर उपयोग करें। आपकी स्क्रिप्ट सुरक्षित दिखती हैं। लेकिन अगर आप मेरे जैसे हैं और कई जीएचसी स्थापित हैं, तो ghc-pkg-clean केवल ghc से जुड़े एक का ख्याल रखता है (स्क्रिप्ट को संशोधित करने में आसान है जो ghc-pkg का उपयोग करने के लिए) और ghc-pkg-reset उन सभी को नकार देगा। तो, मेरे लिए नहीं, लेकिन मैं अजीब हूँ। स्वचालित सहायता के लिए +1। –

संबंधित मुद्दे