2012-09-29 11 views
9

के साथ निर्भरता नरक को हल करना यह परिदृश्य है।कंपोज़र

आपके पास अपने composer.json में पैकेज ए और पैकेज बी है (आपका ऐप इस 2 पैकेज पर निर्भर करता है)।

पैकेज ए और बी दोनों पैकेज सी पर निर्भर करते हैं, लेकिन विभिन्न संस्करणों पर निर्भर करते हैं। कहें ए सी v2.1 पर निर्भर करता है, और बी सी v2.2 पर निर्भर करता है।

और आपको संस्करण विवाद मिलते हैं।

ए, बी और सी दोनों तृतीय पक्ष पैकेज हैं।

इसे कैसे हल करें?

+0

यह या तो ए या बी के साथ काम करने के लिए संभव है सी का एक ही संस्करण? मुझे पता है कि विभिन्न संस्करणों को उन संकुलों द्वारा मजबूर किया जाता है लेकिन आप संस्करणों को ओवरराइट करने के लिए अपने कंपोज़र.जेसन में उन तीनों के लिए रिपॉजिटरीज़ को परिभाषित कर सकते हैं। मुझे पता है कि यह एक हैक है लेकिन यह आपको जाने दे सकता है। –

+0

हां यह है। लेकिन मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं। मै कोशिश करुॅगा। लेकिन मुझे पता है कि क्या आपने अपने संगीतकार.जेसन '"सी": "2.2" 'में रखा है, और ए में" सी ":" 2.1 "है, आपको त्रुटियां मिलेंगी। – umpirsky

+0

हां, लेकिन मेरा विचार सभी तीन पैकेजों के लिए भंडार परिभाषित करना है। तो आप "सी" पर भरोसा करने के लिए ए और बी को बदलते हैं: "2.2"। जब तक दोनों 2.2 के साथ काम कर सकते हैं ... –

उत्तर

3

यह एक हैक है लेकिन शायद आपको आगे बढ़ने देगा।

आप "ए", "बी" और "सी" पैकेज के लिए भंडारों को ओवरराइट कर सकते हैं और "ए" और "बी" को "सी" के समान संस्करण पर भरोसा कर सकते हैं (वास्तव में, हो सकता है कि यह ओवरराइट करने के लिए पर्याप्त हो केवल "ए" और "बी" के लिए भंडार)।

यह तब तक काम करना चाहिए जब तक कि "ए" और "बी" दोनों "सी" के नवीनतम संस्करण के साथ काम कर सकें (इसलिए शायद एक रखरखाव पैकेज संस्करण को अपडेट नहीं किया गया हो)। यदि ऐसा है तो मैं इस परियोजना को पुल अनुरोध भेजने पर भी विचार करता हूं जिसमें निर्भरता का पुराना संस्करण है।

+0

क्यों कंपोज़र पैकेज ए और पैकेज बी को उसी पैकेज के विभिन्न संस्करणों पर निर्भर करने की अनुमति नहीं देता है। एनपीएम ऐसा करने में सक्षम है: http://blog.timoxley.com/post/20772365842/node-js-npm-reducing- निर्भरता- ओवरहेड्स उन्हें सिर्फ कुछ प्रकार की नेस्टेड विक्रेता संरचना की आवश्यकता है! – CMCDragonkai

+1

क्या आप निर्भरता संघर्ष को हल करने के लिए रिपॉजिटरीज़ को ओवरराइट करने के तरीके पर composer.json के अंदर एक उदाहरण देने में सक्षम हैं? – CMCDragonkai

-1

हम इस मेलिंग सूची में यह चर्चा कर रहे हैं: http://news.php.net/php.internals/72594

"नहीं-संघर्ष" तकनीक PHP में लागू किया जाना चाहिए, यह एक संगीतकार की गलती

+1

मैं तर्क दूंगा कि यह निर्भरता प्रबंधन को अलग करने और आपके libs को स्वत: लोड करते समय संदर्भ की कमी की एक वैचारिक समस्या है। भले ही php एक आसान तरीका प्रदान करे, उसी अनुरोध में एक ही लाइब्रेरी को एक ही अनुरोध में अलग-अलग संस्करणों के साथ शामिल करने के लिए (उदाहरण के लिए संगीतकार लोडर संस्करण को अलग-अलग नामस्थानों में निर्यात करेगा), आपको अभी भी किसी भी तरह से अपने libs से कॉल को मानचित्र करना होगा उचित निर्भरता संस्करण। – Tyrael

+0

@Tyrael यह मामूली समस्या की तरह लगता है; आप पैकेज के रूट नेमस्पेस को उपनाम कर सकते हैं ताकि FQNS में पैकेज संस्करण शामिल हो लेकिन सामान्य तरीके से संदर्भित किया जा सके। जैसे/विक्रेता/पैकेज/1.0.0//विक्रेता/पैकेज/के रूप में उपनाम है; हालांकि मुझे लगता है कि आपको स्वतंत्र रूप से स्थापित संस्करण परिवर्तनों को सीमित करने की आवश्यकता होगी, छोटे संस्करणों के साथ बस मौजूदा ओवरराइटिंग के साथ। – Marvin

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