2015-06-18 6 views
44

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

+0

https://www.fpcomplete.com/blog/2015/06/announcing-first-public-beta-stack (संक्षेप में इसे 'कैबल-इंस्टॉल' की जगह लेता है और जितना संभव हो सके स्टैकेज का उपयोग करता है - हो सकता है कुछ बिंदु पर कैबल-इंस्टाल में कुछ बैक-इंटीग्रेशन और मुझे लगता है कि समुदाय यह सुनिश्चित नहीं है कि यह अच्छी बात है या नहीं, क्योंकि यह समुदाय को विभाजित कर सकता है) – Carsten

+0

AFAIU स्टैक एक मौजूदा प्रोजेक्ट पर त्वरित रूप से काम करने के लिए आसान है। यदि आप खरोंच से कुछ शुरू करते हैं, तो आपको निश्चित रूप से कैबल का उपयोग करना होगा। – mb14

+0

@ mb14 यह मामला नहीं है। आप स्क्रैच से परियोजनाओं को शुरू करने के लिए ढेर का उपयोग कर सकते हैं। वास्तव में, ढेर टेम्पलेट्स ऐसा करने का एक आसान तरीका प्रदान करते हैं। – Sibi

उत्तर

28

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

हाँ और नहीं।

जो मामलों में मैं कबाल के बजाय ढेर इस्तेमाल करना चाहिए? क्या कर सकते हैं कि Cabal कर सकते हैं?

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

व्यक्तिगत रूप से, मुझे स्टैक पसंद है। उनका विकास तेज है। वे पीछे की संगतता के बारे में चिंता नहीं करते हैं (इतना अधिक)। और इसमें बहुत बेहतर यूएक्स है। आप के लिए

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

एक अच्छा ब्लॉग पोस्ट अंतर समझा है: Why is Stack not Cabal?

4

मैं क्या पूछे जाने वाले प्रश्न से बटोरने सकता से, यह है कि ढेर कबाल लाइब्रेरी का उपयोग करता है, लेकिन नहीं cabal.exe बाइनरी (अधिक सही ढंग से कबाल से स्थापित के रूप में जाना जाता है)। ऐसा लगता है कि परियोजना का उद्देश्य स्वचालित सैंडबॉक्सिंग और निर्भरता नरक से बचाना है।

दूसरे शब्दों में, यह एक ही कैबल पैकेज संरचना का उपयोग करता है, यह केवल इस सामग्री के प्रबंधन के लिए एक अलग फ्रंट-एंड प्रदान करता है। (मुझे लगता है!)

+0

'कैबल' के अलावा, उनका स्रोत कोड 'डॉकर' का भी उपयोग कर रहा है। हालांकि मुझे नहीं पता कि वे अभी तक इसका उपयोग करते हैं या नहीं। – Sibi

+0

@ सिबी हां, ऐसा लगता है कि आप वैकल्पिक रूप से डॉकर में सामान फेंक सकते हैं, और यह काम करने के लिए है। मैंने इसे और अधिक नहीं देखा है ... – MathematicalOrchid

13

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

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

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

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

  • कबाल से स्थापित, cabal sandbox आदेश के माध्यम से प्रत्येक परियोजना के लिए अलग पैकेज डेटाबेस का समर्थन करता है, हालांकि ढेर और Stackage स्नैपशॉट के साथ वहाँ परियोजनाओं पर सबकुछ साझा इंस्टॉल किए गए पैकेज की कोई संभावना नहीं है के विपरीत है।cabal freeze के माध्यम से .cabal से स्वतंत्र रूप से निर्माण के लिए उपयोग की जाने वाली निर्भरताओं के संस्करणों को ठीक करना भी संभव है। (एक संबंधित कोई कबाल से स्थापित एनालॉग के साथ ढेर सुविधा यानी अलग GHC प्रतिष्ठानों के प्रबंधन stack setup है।)

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

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

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