लाइब्रेरी? स्टेटिक? गतिशील? या फ्रेमवर्क? किसी अन्य प्रोजेक्ट के अंदर प्रोजेक्ट करें


151

मेरे पास एक मौजूदा आईओएस ऐप है और मैं कोड का एक बड़ा हिस्सा जोड़ना चाहता हूं जिसे मैं परीक्षण के आसानी के लिए एक और परियोजना के रूप में विकसित कर रहा हूं। नया हिस्सा मूल रूप से विभिन्न साझाकरण सेवाओं आदि के लिए एक छवि को सहेजने से संबंधित है, क्योंकि उस साझाकरण कोड को बहुत परीक्षण और भविष्य के अद्यतन की आवश्यकता है, मैं सोच रहा था कि उस कोड को मेरे मौजूदा ऐप में शामिल करने का सबसे अच्छा तरीका क्या है।

मुझे नहीं पता कि यह एक स्थिर पुस्तकालय, गतिशील पुस्तकालय या एक ढांचा होना चाहिए और ईमानदारी से, मुझे वास्तव में यकीन नहीं है कि अंतर क्या है, या मुझे इसके बारे में कैसे जाना चाहिए और इसे Xcode में स्थापित करना चाहिए।

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


आप छाता ढाँचा बना सकते हैं, जो 'ढाँचे के अंदर ढाँचा' की तरह है stackoverflow.com/a/27638841/1582217
मोहन इफ्तेखार कुरैशी

जवाबों:


204

सबसे पहले, कुछ सामान्य परिभाषाएँ (iOS के लिए विशिष्ट):

स्टेटिक लाइब्रेरी - संकलन समय पर लिंक की गई एक इकाई, जो बदलती नहीं है।

हालांकि, आईओएस स्टेटिक लाइब्रेरी में इमेज / एसेट्स (केवल कोड) को रखने की अनुमति नहीं है । यद्यपि आप मीडिया बंडल का उपयोग करके इस चुनौती को प्राप्त कर सकते हैं ।

विकिपीडिया पर एक बेहतर, अधिक औपचारिक परिभाषा यहाँ मिल सकती है

डायनेमिक लाइब्रेरी - कोड और / या रनटाइम पर जुड़ी परिसंपत्तियों की एक इकाई जो बदल सकती है।

हालाँकि, केवल Apple को iOS के लिए गतिशील लाइब्रेरी बनाने की अनुमति है। आपको इन्हें बनाने की अनुमति नहीं है, क्योंकि इससे आपका ऐप अस्वीकृत हो जाएगा। ( इस तरह की पुष्टि और तर्क के लिए यह अन्य एसओ पोस्ट देखें )।

सॉफ्टवेयर फ्रेमवर्क - कोड का एक संकलित सेट जो एक कार्य को पूरा करता है ... इसलिए, आपके पास वास्तव में एक स्थिर ढांचा या एक गतिशील ढांचा हो सकता है , जो आमतौर पर ऊपर के संकलित संस्करण हैं।

देखें सॉफ्टवेयर फ्रेमवर्क पर विकी अधिक जानकारी के लिए।

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

अब जब हम इन शर्तों पर स्पष्ट (एर) हो गए हैं, स्थैतिक पुस्तकालय स्थापित करना और iOS के लिए मीडिया बंडल का समर्थन करना बहुत मुश्किल नहीं है, और ऐसे कैसे करना है, इस पर कई ट्यूटोरियल हैं। मैं व्यक्तिगत रूप से इसे सुझाऊंगा:

https://github.com/jverkoey/iOS-Framework

यह एक बहुत ही सीधा-सीधा गाइड है और "नकली स्थिर पुस्तकालयों" से निपटने का नुकसान नहीं है ... अधिक जानकारी के लिए इसे देखें ...

एक बार जब आप अपनी स्टेटिक लाइब्रेरी बना लेते हैं, तो यह विभिन्न परियोजनाओं के उपयोग के लिए Git के भीतर एक सबमॉड्यूल के रूप में इसे शामिल करना जितना आसान है ।

शुभ लाभ।

संपादित करें

एक परियोजना के भीतर एक उपप्रोजेक्ट के बारे में , जहाँ तक मुझे पता है, इसे सही ढंग से काम करने / संकलित करने के लिए, आपको अनिवार्य रूप से एक संकलन श्रृंखला स्थापित करनी होगी, जहाँ उपप्रोजेक्ट पहले संकलित किया जाता है, जो एक स्थैतिक रूपरेखा .aफ़ाइल बनाता है जिसका उपयोग एक निर्भरता के रूप में किया जाता है। परियोजना द्वारा।

यहाँ एक और उपयोगी ट्यूटोरियल है जो इस बारे में बात करता है:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

EDIT 2

IOS 8 के रूप में, Apple अब डेवलपर्स को डायनामिक फ्रेमवर्क बनाने की अनुमति देता है! (नोट: आपके ऐप में डायनेमिक फ्रेमवर्क शामिल करने के लिए iOS 8 का न्यूनतम लक्ष्य होना चाहिए ... बैक पोर्टिंग की अनुमति नहीं है।)

इसे नए प्रोजेक्ट टेम्पलेट के रूप में जोड़ा गया है। Xcode 6.1 में, इस पर पाया जा सकता है:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework

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

क्या एक डायनेमिक प्रोजेक्ट को स्टैटिक प्रोजेक्ट में घसीटा और गिराया जा सकता है, जिससे यह एक स्टैटिक प्रोजेक्ट बन सकता है? मैं वास्तव में उलझन में हूँ, कुछ स्पष्टीकरण वास्तव में बहुत अच्छा होगा! अग्रिम धन्यवाद :-)
रवींद्रनाथ अकिला

1
यदि आप कुछ नियमों का पालन करते हैं तो @ JRG- डेवलपर बैक पोर्टिंग डायनामिक फ्रेमवर्क की अनुमति है: developer.apple.com/library/prerelease/ios/documentation/…
klefevre

क्या न्यूनतम न्यूनतम लक्ष्य निर्धारित करना और पुस्तकालय को वैकल्पिक बनाना संभव है?
कुकुदास

1. क्या आप स्थैतिक पुस्तकालय, गतिशील पुस्तकालय, ढांचे के कुछ प्रसिद्ध उदाहरणों को शामिल कर सकते हैं? 2. क्या आप इस तरह के उदाहरण दे सकते हैं कि आपको ऐसा करने की आवश्यकता कहाँ होगी? 3. जिज्ञासु एक फली और एक स्थिर पुस्तकालय के बीच अंतर क्या है?
हनी

30

मच-ओ फ़ाइल प्रारूप (मच ऑब्जेक्ट - .o)

IOS की दुनिया में हर सोर्स फाइल ऑब्जेक्ट फाइल में बदल जाती है - ABI [अबाउट] मच-ओ फाइल [अबाउट] जिसे एक फाइनल एक्जीक्यूटेबल बंडल (जैसे एप्लिकेशन, फ्रेमवर्क ...), फाइल (जैसे लाइब्रेरी ...) में पैक किया जाएगा। और यह व्यवहार द्वारा निर्धारित किया जाता है Mach-O type[के बारे में]

Packageएक निर्देशिका है जो खुद को एक फ़ाइल के रूप में व्यवहार करती है - opaque file। यह उपयोगकर्ता अनुभव के लिए आंतरिक संरचना में कुछ परिवर्तन करने में जटिल है, जो अप्रत्याशित कार्यक्रम व्यवहार का कारण बन सकता है। पैकेज में Document Packageया के साथ प्रयोग किया जाता है Bundle। आप Show Package Contentsएक खोजक में उपयोग कर सकते हैं

Bundleद्विआधारी (निष्पादन योग्य कोड) और उस कोड के लिए संसाधनों को व्यवस्थित करने के लिए एक विशिष्ट संरचना के साथ एक निर्देशिका है (उदाहरण के लिए चित्र, nibs ...)। बंडल में Info.plist[About] फ़ाइल है। डेवलपर अनुभव के लिए बंडल बनाया गया था । साथ ही इसे पैक भी किया जा सकता है। बंडल कई प्रकार के होते हैं:

  • application bundle - Application target
  • framework bundleऔर versioned bundleउपप्रकार के रूप में -Framework Target
  • loadable bundle(उर्फ plug-in bundle) - Bundle target(UI परीक्षण बंडल, यूनिट परीक्षण बंडल)
  • अन्य ( dSYM[के बारे में] बंडल)

Application- .ipa, .app[के बारे में] - packaged application bundle- प्रशंसनीय कार्यक्रम।

Tests- packaged loadable bundleजिसका उपयोग बाइनरी का परीक्षण करने के लिए किया जाता है। प्लग-इन आर्किटेक्चर हमें मौजूदा बाइनरी में एक अलग मॉड्यूल के रूप में एक नई कार्यक्षमता (परीक्षण मामलों) को जोड़ने की अनुमति देता है

लाइब्रेरी और फ्रेमवर्क

मार्टिन फाउलर इनवर्जनऑफकंट्रोल पर

लाइब्रेरी अनिवार्य रूप से उन कार्यों का एक समूह है जिसे आप कॉल कर सकते हैं, इन दिनों आमतौर पर कक्षाओं में आयोजित किया जाता है। प्रत्येक कॉल कुछ काम करता है और ग्राहक को नियंत्रण लौटाता है।

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

आईओएस पर लाइब्रेरी और फ्रेमवर्क

Libraryएक या एक से अधिक आर्किटेक्चर के लिए संकलित [जाँच स्थैतिक या गतिशील] माच-ओ ऑब्जेक्ट फ़ाइलों का एक संग्रह है ।

Static library- .a(उर्फ स्टेटिक आर्काइव लाइब्रेरी, स्टैटिक लिंक्ड शेयर्ड लाइब्रेरी [डॉक] ) - जब आप इसे अपने एप्लिकेशन में जोड़ते हैं तो संकलन समय के दौरान स्टेटिक लिंकर लाइब्रेरी से ऑब्जेक्ट फाइल्स को मर्ज कर लेगा और उन्हें एप्लीकेशन ऑब्जेक्ट फाइलों के साथ एक सिंगल एक्जीक्यूटेबल में पैकेज करेगा। फ़ाइल। नुकसान एक बड़ी आउटपुट फ़ाइल है

Xcode 9.0 से, स्विफ्ट स्टैटिक लाइब्रेरी समर्थित है।

Dynamic library- .dylib(उर्फ डायनेमिक शेयर्ड लाइब्रेरी, शेयर्ड ऑब्जेक्ट, डायनामिकली लिंक्ड लाइब्रेरी [डॉक] ) डायनामिक रूप से लोड या रनटाइम पर ऐप के एग्जीक्यूटेबल से जुड़ी होती है , लेकिन इसमें कॉपी नहीं किया गया है। प्रैक्टिस ऐप के पैकेज में .dylibफ़ाइल के साथ फ्रेमवर्क फ़ोल्डर होगा । सभी iOS और macOS सिस्टम लाइब्रेरी हैं dynamic। नुकसान एक धीमी शुरुआत का समय है क्योंकि सभी गतिशील पुस्तकालयों को कॉपी और लिंक किया जाना चाहिए।

[स्थिर बनाम गतिशील लिंकिंग]

Text-based stub library - .tbd [अबाउट] , यह एक टेक्स्ट स्टब है,dynamic libraryजो एक लक्ष्य डिवाइस पर स्थित है। परिणामस्वरूप आपको एक गतिशील लाइब्रेरी को अपने बंडल में पैकेज नहीं करना चाहिए। इसका आकार प्रभाव है।

Frameworkउर्फ binary framework-.framework एक है not packaged framework bundle(डेवलपर्स को आसानी से हेडर और संसाधनों पर एक नज़र डालने की अनुमति देने के लिए) जिसमें एक संकलित static or dynamicपुस्तकालय, हेडर फाइलें और संसाधन शामिल हैं।

Static framework एक होते हैं static library अपने संसाधनों के साथ पैक।

Dynamic framework होता है dynamic library और संसाधनों। इसके अलावा, गतिशील ढांचे में एक ही बंडल में एक ही गतिशील पुस्तकालय के विभिन्न संस्करण शामिल हो सकते हैं ( versioned bundle)

[स्थिर बनाम गतिशील रूपरेखा]

Embedded frameworkयह dynamic frameworkऐप के सैंडबॉक्स में रहता है। इस प्रकार को कॉमन कोड और संसाधनों को साझा करने के लिए विस्तार के लिए सबसे पहले बनाया गया था । यह तब उपलब्ध है जब परिनियोजन लक्ष्य iOS 8+ है।

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

Fake Framework- विस्तार के static libraryसाथ एक बंडल बनाने के लिए विशिष्ट ऑपरेशन का एक परिणाम है .frameworkजो खुद को एक के रूप में व्यवहार करेगा dynamic framework। इस टेक्निक का उपयोग तब किया गया था, जब फ्रेमवर्क बनाने में Xcode ने फ्रेमवर्क का समर्थन नहीं किया था। एक नकली ढांचे की प्राप्ति । Xcode 6 के साथ, Apple ने iOS फ्रेमवर्क समर्थन जोड़ा है।

Modular Framework[अबाउट] -@importयह एक फ्रेमवर्क है जिसमें एक.modulemapफ़ाइल होती है। मॉड्यूल में सबमॉड्यूल हो सकते हैं। मुख्य लाभ यह है कि आप के साथ एक बिल्ड समय बचाते हैंModular Framework

Universal Library or Framework(उर्फ फैट) [लिपो] [सकल लक्ष्य] में कई आर्किटेक्चर शामिल हैं। उदाहरण के लिए आपकी रिलीज़ बिल्ड को कुछ आर्क का समर्थन करना चाहिए जिसे आप [ONLY_ACTIVE_ARCH] के माध्यम से विनियमित कर सकते हैंBuild Active Architecture Only

Dependency[के बारे में] आप अपने लक्ष्य के हिस्से के रूप में तीसरे पक्ष के कोड का उपयोग करने में सक्षम हैं। यह आपको बहुत सारे स्रोतों से एक कोड का पुन: उपयोग करने की अनुमति देता है जैसे - एक अन्य परियोजना, एक ही कार्यक्षेत्र में परियोजना, दूसरा लक्ष्य, पुस्तकालय, रूपरेखा आदि।

स्थैतिक पुस्तकालय का निर्माण और उपयोग कैसे करें:

डायनामिक फ्रेमवर्क [स्थैतिक में परिवर्तन] का निर्माण और उपयोग कैसे करें

[Xcode बिल्ड सिस्टम]
[Xcode घटक]
[डायनेमिक लिंकर]


1
कई स्विफ्ट ट्यूटोरियल्स में इसका उल्लेख है कि ऑब्जेक्टिव C डायनेमिक लाइब्रेरीज़ को सपोर्ट नहीं करता है, जहाँ स्विफ्ट सपोर्ट करता है, [ altexsoft.com/blog/engineering/… ] लेकिन जैसा कि मुझे पता है कि, OS8 आगे की तरफ ऑब्जेक्टिव C डायनेमिक लाइब्रेरी को सपोर्ट करता है। क्या आप यह स्पष्ट कर सकते हैं?
प्रतिमा

@pratima, आप iOS के लिए Objective-C पर एक डायनामिक फ्रेमवर्क बनाने में सक्षम हैं
yoAlex5

1
"स्थैतिक ढांचे में एक स्थिर पुस्तकालय होता है जो अपने संसाधनों के साथ पैक किया जाता है।" यह परिभाषा कहां से आई? AFAK, स्टैटिक फ्रेमवर्क का "कॉपी बंडल रिसोर्सेज" बिल्ड फेज़ स्टैटिक लाइब्रेरी की तरह काम नहीं करता है। स्थैतिक ढांचे और स्थिर पुस्तकालय के बीच अंतर क्या है?
तोशी0383

@ toshi0383 क्या आपको स्थिर लाइब्रेरी (.A) को मर्ज करने का एक तरीका मिला और यह संसाधनों (.bundle) को एकल फ्रेमवर्क में मिला है जिसे हम उपभोक्ता को वितरित कर सकते हैं?
user121095

2

आप CocoaPods के लिए .podspec फ़ाइल भी बना सकते हैं ( http://guides.cocoapods.org/making/pStreet-cocoapods.html#1.-create-a-pStreet-spec-repo और इसे किसी अन्य पॉड की तरह उपयोग करें केवल इतना ही अंतर है कि यह आपकी निजी पॉड है और बाहरी दुनिया के लिए दृश्यमान नहीं है (मुझे यकीन नहीं है कि अगर आपका पॉड कोरडेटा मॉडल बनाना चाहिए, लेकिन ऐसा नहीं है, जैसा कि मैं समझता हूं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.