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




cabal haskell-stack (3)

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


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

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

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

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

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

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

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


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

हां और ना।

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

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

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

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

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


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

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





haskell-stack