CocoaPods Plugin Kotlin Multiplatform Mobile के लिए एक Gradle प्लगइन है जो CocoaPods निर्भरता प्रबंधक को सीधे KMM प्रोजेक्ट की बिल्ड प्रणाली में एकीकृत करता है। प्लगइन आपको build.gradle.kts में सीधे iOS निर्भरताएँ (pods) घोषित करने, स्वचालित रूप से Podfile जनरेट करने, pods इंस्टॉल करने और उन्हें Kotlin कोड से जोड़ने की अनुमति देता है। मैन्युअल रूप से .xcworkspace प्रबंधित करने के बजाय, डेवलपर Gradle के माध्यम से iOS निर्भरताओं का प्रबंधन करता है, जिससे KMM प्रोजेक्ट सेटअप पूरी तरह से पुनरुत्पादनीय हो जाता है। JetBrains, 2025 के अनुसार, प्लगइन का उपयोग 20% KMM प्रोजेक्ट्स में iOS लाइब्रेरीज़ प्रबंधित करने के लिए किया जाता है।
मुख्य बिंदु
CocoaPods Plugin (kotlin.cocoapods के नाम से भी जाना जाता है) CocoaPods को Kotlin Multiplatform Mobile के साथ एकीकृत करने के लिए JetBrains का एक आधिकारिक प्लगइन है। प्लगइन Kotlin Gradle DSL का हिस्सा है और इसे सीधे KMM मॉड्यूल के build.gradle.kts में कॉन्फ़िगर किया जाता है। यह Podfile के निर्माण और रखरखाव, .xcworkspace जनरेशन और pod निर्भरताओं के प्रबंधन को स्वचालित करता है, जिससे मैन्युअल Xcode प्रोजेक्ट कॉन्फ़िगरेशन की आवश्यकता समाप्त हो जाती है।
CocoaPods Plugin से पहले, KMM डेवलपर्स को मैन्युअल रूप से Podfile बनाना, pod install चलाना, bridge हेडर कॉन्फ़िगर करना और Gradle निर्भरताओं से अलग pod संस्करणों पर नज़र रखनी पड़ती थी। इससे संस्करण असंगति और CI/CD पाइपलाइनों में कठिनाइयाँ होती थीं। प्लगइन ने iOS निर्भरता प्रबंधन को Android मॉड्यूल में Gradle निर्भरताओं के प्रबंधन जितना सरल बनाकर इन समस्याओं को हल किया।
प्लगइन CocoaPods Trunk से सार्वजनिक pods और निजी रिपॉजिटरी से कस्टम pods दोनों का समर्थन करता है। स्थानीय Podspec और git-आधारित रिपॉजिटरी के साथ काम करना भी समर्थित है। प्लगइन Kotlin 1.6.0 और उससे ऊपर के संस्करणों के साथ संगत है, और डेवलपमेंट मशीन पर CocoaPods (gem install cocoapods) स्थापित होना आवश्यक है।
CocoaPods Plugin Gradle task-graph स्तर पर काम करता है, CocoaPods के साथ काम करने के लिए विशेष कार्य जोड़ता है। मुख्य कार्यों में podInstall (pods स्थापित करना), podGenXcodeWorkspace (.xcworkspace जनरेट करना) और podBuildDebugFramework (फ्रेमवर्क का Debug संस्करण बनाना) शामिल हैं। प्लगइन build.gradle.kts में cocoapods अनुभाग का विश्लेषण करता है, घोषित निर्भरताओं के आधार पर Podfile बनाता है, और आवश्यक पैरामीटर के साथ pod install चलाता है।
प्लगइन की वास्तुकला में तीन घटक शामिल हैं: build.gradle.kts के लिए DSL एक्सटेंशन, Podfile बनाने के लिए Podfile जनरेटर और .xcworkspace कॉन्फ़िगर करने के लिए Xcode एकीकरण परत। DSL एक्सटेंशन निर्भरताएँ घोषित करने के लिए नेस्टेड pod() फ़ंक्शन, निजी रिपॉजिटरी निर्दिष्ट करने के लिए specRepo() और आउटपुट फ्रेमवर्क कॉन्फ़िगर करने के लिए framework { } के साथ एक cocoapods { } ब्लॉक प्रदान करता है। Podfile जनरेटर इन घोषणाओं को CocoaPods द्वारा समझी जाने वाली Ruby सिंटैक्स में अनुवादित करता है।
kotlin {
cocoapods {
summary = "Shared module for iOS project"
homepage = "https://itsectr.com"
framework {
baseName = "Shared"
isStatic = true
export(project(":core"))
}
pod("Alamofire") {
version = "~> 5.9"
}
pod("Kingfisher") {
version = "7.12"
}
}
}
podInstall निष्पादित करते समय, प्लगइन क्रमिक रूप से: प्रोजेक्ट रूट में Podfile जनरेट करता है, कमांड लाइन के माध्यम से pod install चलाता है, .xcworkspace जनरेट करता है, जाँचता है कि pod संस्करण घोषित संस्करणों से मेल खाते हैं, और Podfile.lock को कैश करता है। बाद के रनों में कॉन्फ़िगरेशन परिवर्तनों के बिना, podInstall को छोड़ दिया जाता है यदि Podfile.lock नहीं बदला है। यह CI/CD में समय बचाता है, जहाँ pod install को साफ इंस्टॉलेशन में 2-3 मिनट तक लग सकते हैं।
CocoaPods Plugin सेटअप करने के लिए कई चरण आवश्यक हैं। डेवलपमेंट मशीन पर CocoaPods स्थापित करना (gem install cocoapods) एक पूर्वापेक्षा है। फिर, शेयर्ड मॉड्यूल के build.gradle.kts में, फ्रेमवर्क कॉन्फ़िगरेशन और निर्भरताओं के साथ एक cocoapods { } ब्लॉक जोड़ा जाता है। कॉन्फ़िगरेशन के बाद, podInstall कार्य निष्पादित करें, जो Podfile बनाएगा और pods स्थापित करेगा। जनरेट किया गया .xcworkspace Podfile के बगल में प्रोजेक्ट रूट में स्थित होगा।
प्लगइन Xcode बिल्ड फेज़ के साथ एकीकृत होता है। iOS ऐप बनाते समय, Xcode embedAndSignAppleFrameworkForXcode चलाता है — एक कार्य जो Kotlin/Native फ्रेमवर्क को ऐप बंडल में कॉपी करता है। CocoaPods Plugin .xcworkspace जनरेट करते समय इस बिल्ड फेज़ को स्वचालित रूप से जोड़ता है। यदि .xcworkspace जनरेट किया गया था, तो pod निर्भरताओं के साथ सही बिल्ड के लिए इसे .xcodeproj के बजाय खोला जाना चाहिए।
| चरण | विवरण | कमांड / क्रिया |
|---|---|---|
| 1 | CocoaPods स्थापित करें | gem install cocoapods |
| 2 | build.gradle.kts में प्लगइन जोड़ें | kotlin { cocoapods { ... } } |
| 3 | pods घोषित करें | pod("Alamofire") { version = "5.9.0" } |
| 4 | Podfile जनरेट करें | ./gradlew :shared:podInstall (स्वचालित रूप से) |
| 5 | .xcworkspace खोलें | .xcodeproj के बजाय |
| 6 | iOS ऐप बनाएँ | Xcode Build (⌘B) |
आइए CocoaPods Plugin में pods घोषित करने के विभिन्न परिदृश्यों को देखें। मूल मामला निर्दिष्ट संस्करण के साथ CocoaPods Trunk से एक सार्वजनिक pod कनेक्ट करना है। अधिक जटिल परिदृश्यों में कस्टम podspec, स्थानीय pods और git रिपॉजिटरी से pods का उपयोग शामिल है।
kotlin {
iosArm64()
iosSimulatorArm64()
cocoapods {
framework {
baseName = "Shared"
isStatic = false
}
// CocoaPods Trunk से सार्वजनिक pod
pod("Alamofire") { version = "5.9.0" }
// ऑपरेटर के साथ कस्टम संस्करण
pod("SnapKit") { version = "~> 5.6" }
// निजी रिपॉजिटरी से pod
specRepo("https://git.itsectr.com/specs.git",
"internal-specs")
pod("InternalAnalyticsPod")
// पथ के साथ स्थानीय pod
pod(name = "CustomPod",
localPath = "./ios-pods/CustomPod")
// git रिपॉजिटरी से pod
pod(name = "PrivateSDK",
git = "https://git.itsectr.com/ios/sdk.git",
tag = "2.1.0")
}
}
pods कनेक्ट करना कॉन्फ़िगरेशन का केवल एक हिस्सा है। प्लगइन आपको अन्य Kotlin मॉड्यूल से iOS फ्रेमवर्क में निर्भरताएँ निर्यात करने की भी अनुमति देता है। export(project(":core")) फ़ंक्शन निर्दिष्ट करता है कि :core मॉड्यूल के सभी सार्वजनिक API जनरेट किए गए फ्रेमवर्क के Objective-C हेडर से सुलभ होने चाहिए। यह आवश्यक है जब साझा Kotlin कोड किसी अन्य मॉड्यूल से क्लास का उपयोग करता है और उन्हें Swift से सुलभ होने की आवश्यकता होती है।
cocoapods {
framework {
baseName = "Shared"
// iOS फ्रेमवर्क में मॉड्यूल निर्यात करें
export(project(":network"))
export(project(":domain"))
// स्थिर या गतिशील लिंकिंग
isStatic = true
}
// निर्यात किए गए मॉड्यूल के लिए आवश्यक pod
pod("Moya") { version = "15.0" }
}
कॉन्फ़िगरेशन के बाद, Podfile जनरेट करने और निर्भरताएँ स्थापित करने के लिए podInstall चलाना आवश्यक है। फिर जनरेट किया गया .xcworkspace Xcode में खोला जाता है, जहाँ ऐप को मानक विधि से बनाया जा सकता है। CI/CD के लिए, सुनिश्चित करें कि बिल्ड मशीन पर CocoaPods और Ruby स्थापित हैं। प्लगइन CI वातावरण में काम करने के लिए --no-daemon फ़्लैग का समर्थन करता है।
// pods स्थापित करने से Podfile + xcworkspace जनरेट होता है
./gradlew :shared:podInstall
// परीक्षण के लिए debug फ्रेमवर्क बनाएँ
./gradlew :shared:podBuildDebugFramework
// कमांड लाइन से पूर्ण iOS बिल्ड
xcodebuild -workspace ios-app.xcworkspace \
-scheme ios-app -configuration Debug
Swift Package Manager (SPM) Apple का एक वैकल्पिक निर्भरता प्रबंधक है जो लोकप्रियता प्राप्त कर रहा है और धीरे-धीरे iOS समुदाय में CocoaPods की जगह ले रहा है। हालाँकि, CocoaPods Plugin कई कारणों से प्रासंगिक बना हुआ है: SPM KMM संदर्भ में डायनामिक फ्रेमवर्क का समर्थन नहीं करता है, और SPM के माध्यम से Kotlin/Native फ्रेमवर्क के एकीकरण के लिए अतिरिक्त सेटअप की आवश्यकता होती है। CocoaPods Plugin अधिक परिपक्व और दस्तावेज़ीकृत एकीकरण पथ प्रदान करता है।
CocoaPods Plugin और सीधे SPM एकीकरण की तुलना से पता चलता है कि पहला स्वचालन में जीतता है, जबकि दूसरा मूल Apple समर्थन में जीतता है। CocoaPods Plugin स्वचालित रूप से Podfile जनरेट करता है, संस्करणों का प्रबंधन करता है और Xcode बिल्ड फेज़ कॉन्फ़िगर करता है। SPM को Package.swift के माध्यम से Kotlin फ्रेमवर्क को मैन्युअल रूप से कनेक्ट करने की आवश्यकता होती है, जो बड़े KMM प्रोजेक्ट्स के लिए बनाए रखना अधिक कठिन है। JetBrains Kotlin/Native के लिए SPM समर्थन पर काम कर रहा है, लेकिन 2025 तक SPM एकीकरण प्रयोगात्मक बना हुआ है।
| विशेषता | CocoaPods Plugin | Swift Package Manager |
|---|---|---|
| परिपक्वता | उत्पादन-तैयार | प्रयोगात्मक |
| Podfile जनरेशन | स्वचालित | लागू नहीं |
| डायनामिक फ्रेमवर्क | समर्थित | सीमित |
| CI/CD सेटअप | सरल (Gradle कार्य) | मैन्युअल चरण आवश्यक |
| निजी रिपॉजिटरी | समर्थित (specRepo) | समर्थित (URL) |
| मूल Apple समर्थन | CocoaPods के माध्यम से | मूल |
CocoaPods Plugin का उपयोग करते समय, KMM डेवलपर्स कई विशिष्ट समस्याओं का सामना करते हैं। pod संस्करण विरोध सबसे आम समस्या है, जब दो pods को एक ही निर्भरता के विभिन्न संस्करणों की आवश्यकता होती है। समाधान pod("Dependency") { version = "x.x" } के माध्यम से विरोध करने वाली निर्भरता के संस्करण को स्पष्ट रूप से निर्दिष्ट करना है। दूसरा सामान्य मामला संस्करण असंगति है, जब एक pod को KMM प्रोजेक्ट के न्यूनतम संस्करण से नए iOS SDK की आवश्यकता होती है।
.xcworkspace के साथ समस्याएँ तब उत्पन्न होती हैं यदि प्लगइन कॉन्फ़िगर करने के बाद .xcodeproj को .xcworkspace के बजाय खोला जाता है। प्लगइन podInstall लॉग में इसके बारे में चेतावनी देता है। एक और लगातार त्रुटि डेवलपमेंट मशीन पर CocoaPods की अनुपस्थिति है। प्लगइन podInstall चलाने से पहले pod कमांड की उपस्थिति की जाँच करता है और एक स्पष्ट त्रुटि संदेश दिखाता है। CI/CD के लिए, CocoaPods स्थापित करें: gem install cocoapods.
// संस्करण विरोध हल करें
cocoapods {
pod("Alamofire") { version = "5.9.0" }
// विरोध को स्पष्ट रूप से हल करें
pod("Alamofire") {
version = "5.9.0"
options[name] = mapOf("force" to true)
}
}
// Gradle के माध्यम से CocoaPods इंस्टॉलेशन जाँचें
tasks.register("checkCocoapods") {
doLast {
val result = "pod --version".runCommand()
println("CocoaPods संस्करण: $result")
}
}
यदि podInstall विफल होता है, तो विस्तृत आउटपुट के लिए --info फ़्लैग का उपयोग करें: ./gradlew podInstall --info। प्लगइन प्रत्येक चरण को लॉग करता है: Podfile जनरेशन, pod install निष्पादन, Podfile.lock पार्सिंग। अक्सर, त्रुटियाँ नेटवर्क समस्याओं (CocoaPods Trunk अनुपलब्ध) या गलत Podfile सिंटैक्स से संबंधित होती हैं। ऐसे मामलों में, CocoaPods से अधिक विस्तृत त्रुटि संदेश प्राप्त करने के लिए प्रोजेक्ट रूट में मैन्युअल रूप से pod install चलाने का प्रयास करें।
अक्सर पूछे जाने वाले प्रश्न
यदि सभी iOS निर्भरताएँ SPM के माध्यम से प्रबंधित की जाती हैं, तो CocoaPods Plugin आवश्यक नहीं है। प्लगइन CocoaPods के साथ एकीकरण के लिए आवश्यक है। JetBrains SPM समर्थन पर काम कर रहा है, लेकिन 2025 तक यह प्रयोगात्मक है।
बिल्ड समय केवल पहले podInstall रन (Podfile जनरेशन + pod इंस्टॉलेशन) के दौरान बढ़ता है। बाद के बिल्ड Podfile.lock कैश का उपयोग करते हैं। Kotlin/Native फ्रेमवर्क बिल्ड स्वयं pods पर निर्भर नहीं करता है।
हाँ, प्लगइन निजी रिपॉजिटरी कनेक्ट करने के लिए specRepo सुविधा का समर्थन करता है। specRepo में रिपॉजिटरी URL और नाम निर्दिष्ट करें, जिसके बाद उस रिपॉजिटरी के pods घोषणा के लिए उपलब्ध हो जाते हैं।
विस्तृत त्रुटि संदेश के लिए प्रोजेक्ट रूट में मैन्युअल रूप से pod install चलाएँ। CocoaPods Trunk से कनेक्शन, pod संस्करणों की शुद्धता और मशीन पर Ruby की उपस्थिति की जाँच करें।
हाँ, पुनरुत्पादनीय बिल्ड के लिए Podfile.lock को कमिट किया जाना चाहिए। CocoaPods Plugin Podfile जनरेट करता है, लेकिन Podfile.lock pod install के दौरान स्थापित सटीक pod संस्करणों को लॉक करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें