haskell - काबाल और स्टैक में क्या अंतर है?




cabal haskell-stack (2)

क्या कैबेल के लिए एक प्रतिस्थापन है?

हां और ना।

मुझे कैबल के बजाय किन मामलों में स्टैक का उपयोग करना चाहिए? स्टैक क्या कर सकता है कि काबाल नहीं कर सकता है?

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

व्यक्तिगत रूप से, मुझे स्टैक पसंद है और हर हास्केल डेवलपर्स को इसका उपयोग करने की सिफारिश करेंगे। उनका विकास तेज है । वे पीछे की संगतता के बारे में चिंता नहीं करते हैं। और इसमें बहुत बेहतर UX है। और ऐसी चीजें हैं जो stack करती हैं जो Cabal अभी तक प्रदान नहीं करती हैं:

  • ढेर भी आपके लिए जीएचसी डाउनलोड करता है और इसे एक अलग स्थान पर रखता है।
  • डॉकर समर्थन (जो आपके हास्केल अनुप्रयोगों को तैनात करने के लिए बहुत सुविधाजनक है)
  • Reproducible Haskell स्क्रिप्ट : आप किसी पैकेज के संस्करण को इंगित कर सकते हैं और यह गारंटी ले सकते हैं कि यह बिना किसी समस्या के हमेशा निष्पादित होगा।
  • stack build --fast --file-watch करने की क्षमता। यदि आप मौजूद स्थानीय फ़ाइलों को बदलते हैं तो यह स्वचालित रूप से पुनर्निर्माण करेगा। इसके साथ --pedantic ऑप्शन का उपयोग करना मेरे लिए एक डील-ब्रेकर है।
  • एक निर्भरता के रूप में बाहरी गिट रिपॉजिटरी को निर्दिष्ट करने की क्षमता। कैबल 2.4 के साथ शुरू, काबल भी निर्भरता के रूप में बाहरी गिट रिपॉजिटरी का समर्थन करता है। (यहां ध्यान देने वाली बात यह है कि स्टैक में 3 साल से अधिक समय से यह सुविधा थी और कैबल ने आखिरकार इसे पकड़ लिया)।
  • स्टैक templates का उपयोग करके प्रोजेक्ट बनाने का समर्थन करता है। यह आपके अपने कस्टम टेम्प्लेट का भी समर्थन करता है।
  • स्टैक में इसमें बिल्ट-इन hpack सपोर्ट है। यह yaml फ़ाइल का उपयोग करके केबल फाइल लिखने का एक बेहतर (IMO) एक बेहतर तरीका प्रदान करता है जो उद्योग में अधिक व्यापक रूप से उपयोग किया जाता है।
  • स्टैक के साथ काम करते समय इंटरो को एक चिकनी अनुभव होता है

अंतर बताने वाला एक अच्छा ब्लॉग पोस्ट है: स्टैक नॉट कैबल?

कल मुझे Stack नामक एक नए हास्केल टूल के बारे में पता चला। पहले ब्लश पर, ऐसा लगता है कि यह काबाल के समान ही काम करता है। तो, उनके बीच क्या अंतर है? क्या कैबेल के लिए एक प्रतिस्थापन है? मुझे कैबल के बजाय किन मामलों में स्टैक का उपयोग करना चाहिए? स्टैक क्या कर सकता है कि काबाल नहीं कर सकता है?


इस प्रकार, मैं दो उपकरणों का उल्लेख करूंगा जिनकी तुलना केबल-इंस्टॉल और स्टैक के रूप में की जा रही है। विशेष रूप से, मैं कैबल- लाइब्रेरी के साथ भ्रम से बचने के लिए कैब-इंस्टॉल का उपयोग करूंगा, जो कि दोनों उपकरणों द्वारा उपयोग किया जाने वाला सामान्य बुनियादी ढांचा है। मोटे तौर पर, हम कह सकते हैं कि कैबल-इनस्टॉल और स्टैक कैबल के लिए फ्रंटएंड हैं, और उन दोनों के बीच मुख्य अंतर यह है कि डिफ़ॉल्ट वर्कफ़्लोज़ क्या हैं:

  • डिफ़ॉल्ट रूप से, केबल-इंस्टॉल इच्छा, जब एक परियोजना का निर्माण करने के लिए कहा जाता है, तो इसकी .cabal फ़ाइल में निर्दिष्ट निर्भरता को देखें और इसे पूरा करने के लिए पैकेजों और पैकेज संस्करणों का एक सेट (यदि संभव हो) निकालने के लिए एक निर्भरता सॉल्वर का उपयोग करें। यह सेट एक पूरे - सभी संकुल और सभी संस्करणों, अतीत और वर्तमान के रूप में Hackage से तैयार किया गया है। एक बार एक संभव निर्माण योजना मिल जाने के बाद, निर्भरता के चुने हुए संस्करण, डिफ़ॉल्ट रूप से, स्थापित किए जा सकते हैं और स्थापित पैकेजों के एकल डेटाबेस में कहीं और पंजीकृत किए जा सकते हैं ~/.cabal~/.cabal

  • दूसरी ओर, स्टैक , पहले स्टैक के resolver फ़ील्ड को stack.yaml । वह फ़ील्ड आमतौर पर Stackage स्नैपशॉट निर्दिष्ट करता है , जो कि निश्चित संस्करणों के साथ हैकेज पैकेजों का एक सबसेट है जो पारस्परिक रूप से संगत होने के लिए जाना जाता है। स्टैक तब डिफ़ॉल्ट रूप से, स्नैपशॉट द्वारा प्रदान की गई निर्भरता का उपयोग करके निर्भरता को संतुष्ट करने का प्रयास करेगा। एक स्नैपशॉट से इंस्टॉल किए गए पैकेज अलग-अलग और अलग-अलग डेटाबेस में पंजीकृत हैं, और स्नैपशॉट की आवश्यकता के लिए जीएचसी की अलग-अलग स्थापना को ध्यान में रखा जाता है। यह दृष्टिकोण इस गारंटी से थोड़ा लचीलापन देता है कि इंस्टॉल किए गए पैकेजों के बीच कोई संस्करण असंगतता नहीं होगी ( इस आलेख में चर्चा किए गए कारणों के लिए, कैब-इंस्टॉल के साथ एकल पैकेज डेटाबेस का उपयोग करते समय एक आम समस्या), साथ ही साथ यह हमेशा संभव है एक परियोजना का निर्माण करने के लिए उपयोग की जाने वाली निर्भरता के सटीक संस्करणों का पता लगाने के लिए (जो पूरी तरह से फीडलेस परियोजनाओं के प्रतिलिपि प्रस्तुत करने योग्य बिल्ड को सुनिश्चित करने के लिए और एक साथी के बिना स्व-निहित .hs स्क्रिप्ट की निर्भरता को आसानी से निर्दिष्ट करने के लिए .cabal है)।

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

  • कैबल-इंस्टॉल प्रत्येक प्रोजेक्ट के लिए अलग - अलग पैकेज डेटाबेस का समर्थन करता है cabal sandbox कमांड के माध्यम से, हालांकि स्टैक और स्टैकेज स्नैपशॉट के साथ-साथ प्रोजेक्ट्स में स्थापित पैकेज साझा करने की कोई संभावना नहीं है। स्वतंत्र रूप से .cabal निर्माण के लिए उपयोग की जाने वाली निर्भरता के संस्करणों को .cabal करना, .cabal cabal freeze माध्यम से भी संभव है। (बिना केबल-इंस्टॉल किए एनालॉग के साथ एक संबंधित स्टैक फीचर अलग जीएचसी इंस्टॉलेशन यानी stack setup का प्रबंधन है।)

  • स्टैक प्रोजेक्ट्स स्टैकेज स्नैपशॉट से उपलब्ध पैकेज का उपयोग नहीं कर सकते हैं जिसका उपयोग स्टैक में उपलब्ध फ़ील्ड्स को करके किया जा रहा है। स्टैम में उपलब्ध पैकेज के लिए extra-deps stack.yaml (हैकैज से उपलब्ध पैकेजों के लिए extra-deps डिपॉजिट्स, और packages के कस्टम location के साथ पैकेज नहीं हैं)। ये नॉन-स्टैकेज पैकेज प्रति-प्रोजेक्ट के आधार पर स्थापित किए जाते हैं, जिसमें स्नैपशॉट से अलगाव होता है। एक stack solver कमांड भी है, जो हैकैज (यानी नॉन-स्टैक) निर्भरता के लिए स्वचालित निर्भरता को हल करता है।

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







haskell-stack