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


105

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


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

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

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

अच्छे अवलोकन के लिए यह लघु लेख देखें: scs.stanford.edu/16wi-cs240h/labs/stack.html
michid

जवाबों:


77

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

हां और ना।

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

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

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

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

अंतर बताने वाला एक अच्छा ब्लॉग पोस्ट है: स्टैक नॉट कैबल? जबकि काबल ने उस पोस्ट के बाद के वर्षों में हस्तक्षेप किया है, ताकि वहां पर चर्चा की गई कुछ मुद्दों को दूर किया जा सके, स्टैक के पीछे डिजाइन लक्ष्यों और दर्शन की चर्चा प्रासंगिक बनी हुई है।


क्या कैबेल 3 के रिलीज़ होने के बाद से कोई बदलाव आया है?
विलियम रुस्नाक

1
@WilliamRusnack हाँ, वहाँ है। मुख्य रूप से, डिफ़ॉल्ट काबाल वर्कफ़्लो में अब निर्भरता संघर्ष से बचाव शामिल है, हालांकि ऐसा करने के लिए जो रणनीति का उपयोग करता है वह स्टैक से अलग है। (@ बीबी: मैंने आपके उत्तर को अपडेट करने के लिए स्वतंत्रता ले ली है ताकि यह बेहतर तरीके से प्रतिबिंबित हो जाए कि चीजें इन दिनों कहां हैं।)
डुप्लोड

35

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

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

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

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

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

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


11

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

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


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

@ सिबी हाँ, ऐसा लगता है कि आप वैकल्पिक रूप से डॉकर में सामान फेंक सकते हैं, और यह काम करने के लिए है। मैं बहुत आगे इसे देखा नहीं है ...
MathematicalOrchid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.