2016-12-06 13 views
5

बनाते समय निर्भरताओं को कैसे संभाला जाए मैं वर्तमान में एक एसडीके पर काम कर रहा हूं जो एंड्रॉइड & आईओएस मंच दोनों पर उपलब्ध है।एंड्रॉइड और आईओएस: एसडीके

एंड्रॉइड के लिए, हम अपनी ग्रैडल फ़ाइल में निर्भरता सूचीबद्ध करते हैं और एसडीके प्रदान करने के लिए मेवेन का उपयोग करते हैं (इसलिए हमारी निर्भरता .pom फ़ाइल में सूचीबद्ध हैं)।

आईओएस के लिए, हम निर्भरताओं को संभालने के लिए कोकोपोड का उपयोग करते हैं।

समस्या

है निम्नलिखित: * हमारे एसडीके संस्करण में एक निर्भरता का उपयोग एक्स * हमारे ग्राहक एक ही निर्भरता लेकिन संस्करण में वाई * एक अन्य ग्राहक भी संस्करण जेड

में ठीक उसी निर्भरता का उपयोग कर सकते का उपयोग कर सकते में से एक

तो, यह हमारी एसडीके संभवतः हमारे ग्राहक से एक पर तोड़ा जा रहा है की ओर जाता है (यदि नहीं दोनों) क्योंकि हम सुनिश्चित करें कि यह निर्भरता एक्स के साथ काम करता है, लेकिन नहीं Y और जेड

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

लेकिन मेरी राय में, यह एक उपयुक्त समाधान नहीं है: हमारे पास नवीनतम सुधार नहीं हैं, यह अद्यतन करने के लिए दर्दनाक है, क्लाइंट के बजाय पुस्तकालय में दो बार पुस्तकालय है।

तो, अभी के लिए, मैं एक संभावित अच्छे समाधान के बारे में सोचने की कोशिश कर रहा हूं, लेकिन मुझे Google पर जो चाहिए वह नहीं मिल सका (शायद मैं सही कीवर्ड का उपयोग नहीं कर रहा हूं: /)।

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

हालांकि, मुझे नहीं पता कि यह सही तरीका है या नहीं? क्या कोई अन्य समाधान है?

1.-यदि आप Maven के साथ अपने पुस्तकालय का निर्माण, तो आप उपयोग कर सकते हैं:

धन्यवाद :)

+0

मुझे नहीं लगता कि आप जो हासिल करने की कोशिश कर रहे हैं वह संभव है। भले ही आप अपना 'कोड' संस्करण को स्वतंत्र मानते हैं, फिर भी आपकी लाइब्रेरी को अभी भी उल्लेख करना होगा कि यह अन्य पुस्तकालयों पर निर्भर करता है। यदि आप एक संस्करण निर्दिष्ट नहीं करते हैं, तो नवीनतम संस्करण माना जाएगा (कम से कम कोकोपोड में)। आप निर्भरताओं के तहत एक ही पुस्तकालय के कई संस्करणों का उल्लेख नहीं कर सकते हैं। जब तक संस्करणों को एक साथ उपयोग करने के लिए स्पष्ट रूप से बनाया नहीं जाता है। – lukya

+0

हालांकि आप क्या कर सकते हैं, आपके ** बेस एसडीके ** के कई संस्करण बनाते हैं, केवल 'निर्भरता' संस्करण होने के अंतर में। जैसा कि आपने कहा था कि आप निर्भरता के सभी संस्करणों का समर्थन करने के लिए अपना ** बेस कोड ** बदल सकते हैं जिसके लिए आप अलग संस्करण बनाने की योजना बना रहे हैं। फिर, आपके एसडीके के विभिन्न संस्करणों के बीच एकमात्र अंतर निर्भरता के विशिष्ट संस्करण का उल्लेख करते हुए पोम/पॉड फ़ाइल होगा। आपको अपने क्लाइंट के लिए अपने एसडीके का सही संस्करण चुनने के लिए निर्भरता संस्करणों के सभी संयोजनों का एक मैट्रिक्स बनाए रखना होगा। – lukya

+0

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

उत्तर

2

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

2. बचाव के लिए अमूर्त! आप अपनी परियोजना को मुख्य पुस्तकालय और प्लगइन पुस्तकालयों में विभाजित कर सकते हैं। मुख्य पुस्तकालय उपयोगकर्ता को हर वर्ग को एक विधि दिखाएगा और वह वह होगा जो वे अपने ऐप्स से कॉल करेंगे। मुख्य पुस्तकालय के अंदर, सभी कक्षाएं प्रत्येक बाहरी एसडीके या निर्भरता को अप्रत्यक्ष रूप में आयात करती हैं, एक सामान्य आवरण जो या तो एक सार वर्ग या इंटरफ़ेस हो सकता है, और उन्हें इस तरह उपयोग कर सकता है। उदाहरण के लिए, हो सकता है कि आप एक उन्नत फेसबुक लॉगिन यूआई प्रदान कर रहे हों। फिर, फेसबुक एसडीके को सीधे अपने दृश्य में संदर्भित करने के बजाय, आप एक facebookLoginInterface का संदर्भ लेंगे और इसे कॉल करेंगे। फिर, आपके पास एक माध्यमिक प्रोजेक्ट होगा, facebookLogin41, जहां आप फेसबुक एसडीके 4.1 का उपयोग करके फेसबुक लॉजिन्टर इंटरफेस को कार्यान्वित करेंगे, और दूसरा, facebookLogin418, जहां आप फेसबुक एसडीके 4.1.8 का उपयोग करके एक ही इंटरफ़ेस को लागू करते हैं। फिर, पुस्तकालय उदाहरण facebookLoginInterface बनाने के लिए, निर्भरता इंजेक्शन ढांचे (रोबोगुइस प्रदाता एक बहुत अच्छा उदाहरण), मेवेन निर्भरता क्षेत्र (उदाहरण के लिए, उदाहरण के लिए) आदि जैसे तर्क प्रदान करने के कुछ प्रकार को लागू करें।अंत में, ग्राहक केवल मुख्य पुस्तकालय और द्वितीयक परियोजना दोनों आयात करता है और मुख्य पुस्तकालय का उपयोग करता है।

+0

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

+0

जब तक आप निर्भरता अनुबंध रखते हैं (उसी विरोधाभासी निर्भरताओं का उपभोग करने वाले प्लगइन मर्ज करें), तो आप प्लगइन को विलय कर देंगे। –

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