2016-08-08 2 views
6

मैंने हाल ही में अपनी परियोजना के लिए बाहरी निर्भरताओं को निर्दिष्ट करते समय, हास्केल के लिए स्टैक का उपयोग करना शुरू कर दिया है। कभी-कभी आप इसे .cabal फ़ाइल में रखते हैं जबकि अन्य बार आप इसे .yaml फ़ाइल में रखते हैं।stack.yaml फ़ाइल और .cabal फ़ाइल अंतर?

क्या मैं सोच रहा हूं कि जब आप इसे कैबल फ़ाइल में डालते हैं तो यह केवल आपके पैकेज के लिए स्टैकेज रिपोजिटरी में दिखता है। हालांकि जब आप इसे अपनी .yaml फ़ाइल में रखते हैं तो यह हैकेज सर्वर में भी खोज करता है, अगर इसे किसी भी स्नैपशॉट में नहीं मिल रहा है?

+0

"इसे अपनी .yaml फ़ाइल में रखें" से आपका क्या मतलब है? क्या आप एक उदाहरण दे सकते हैं? – ErikR

उत्तर

12

आपकी परियोजना के लिए सभी निर्भरता .cabal फ़ाइल में जाती हैं। हालांकि, आप सही हैं, कभी-कभी आप stack.yaml फ़ाइल में संकुल भी सूचीबद्ध करते हैं, जो समझ में आ सकता है। ऐसा क्यों है?

खैर, .cabal फ़ाइल हमेशा संकुल पर अपनी निर्भरता को व्यक्त करता है, लेकिन stack.yaml फ़ाइल को प्रभावी ढंग से जहां उन संकुल से आते हैं कॉन्फ़िगर करता है। आमतौर पर, stack का उपयोग करते समय, पैकेज रिज़ॉल्वर पर आधारित स्टैकेज से आते हैं जो आप stack.yaml फ़ाइल में निर्दिष्ट करते हैं। हालांकि, स्टैकेज में हैकेज में सभी संकुल शामिल नहीं हैं, और इसका उद्देश्य यह नहीं है कि जब आपको स्टैकेज के बाहर रहने वाले पैकेज की आवश्यकता होती है, तो आपको उन्हें stack.yaml फ़ाइल में निर्दिष्ट करना होगा।

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

हैकेज से पैकेज खींचते समय, आपके पास यह विलासिता नहीं है, इसलिए आपको का उपयोग करके अपने संस्करणों को संकुल और निर्दिष्ट करने की आवश्यकता है।

extra-deps: 
- crypto-pubkey-openssh-0.2.7 
- data-bword-0.1 
- data-dword-0.3 

इस प्रविष्टि विशेष रूप से निर्धारित करता है जो संस्करण जिनमें से संकुल Hackage बजाय Stackage से खींचा जाना चाहिए: उदाहरण के लिए, आप कुछ इस तरह हो सकता है।


जब एक आवेदन के निर्माण, इस लग सकता है एक छोटे से बेमानी-आप भी .cabal फ़ाइल में संस्करण की कमी निर्दिष्ट कर सकते हैं, तो क्यों उन्हें stack.yaml फ़ाइल में नकल? हालांकि, लाइब्रेरी का निर्माण करते समय, भेद थोड़ा अधिक महत्वपूर्ण होता है: .cabal फ़ाइल आपकी लाइब्रेरी की वास्तविक संस्करण बाधाओं को व्यक्त करती है (यदि कोई हो), लेकिन stack.yaml फ़ाइल स्थानीय रूप से विकसित होने पर वास्तव में कौन से संस्करण स्थापित करने के लिए निर्दिष्ट करती है।

इस अर्थ में, stack.yaml फ़ाइल, एक उद्देश्य के अन्य पैकेज प्रबंधकों की Gemfile.lock या npm-shrinkwrap.json फ़ाइलों के समान कार्य करता है, हालांकि जिम्मेदारियों लगभग के रूप में स्पष्ट कैसे हास्केल के पैकेज प्रणाली के आसपास stack (भाग में कारण के लिए ऐतिहासिक कारणों के साथ नहीं हैं काम करता है और अतीत में हुई कुछ समस्याएं)।

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