Swift के साथ मोनोरेपॉजिटरी: व्यवहार में कोड का संगठन
आधुनिक iOS और macOS डेवलपमेंट में, कोड प्रबंधन रणनीति का चुनाव एक प्रमुख कारक है जो स्केलेबिलिटी, डिलीवरी की गति और उत्पाद की गुणवत्ता को प्रभावित करता है। परंपरागत रूप से, डेवलपर्स मल्टीरेपॉजिटरी (polyrepo) का उपयोग करते थे, जहाँ प्रत्येक मॉड्यूल या सेवा एक अलग Git रिपॉजिटरी में रहती है। हालाँकि, प्रोजेक्ट्स और टीमों के बढ़ने के साथ, यह सवाल अक्सर उठता है: कोड को इस तरह कैसे व्यवस्थित किया जाए कि वह अभिन्न, पुन: प्रयोज्य और आसानी से बनाए रखने योग्य रहे? इसका उत्तर है Swift के साथ मोनोरेपॉजिटरी (monorepo)। इस लेख में, हम जानेंगे कि मोनोरेपॉजिटरी क्या है, यह Swift प्रोजेक्ट्स के लिए क्यों उपयुक्त है, और Swift Package Manager (SPM) का उपयोग करके इसे व्यवहार में कैसे व्यवस्थित किया जाए।
मोनोरेपॉजिटरी क्या है और Swift में इसकी आवश्यकता क्यों है?
मोनोरेपॉजिटरी एक दृष्टिकोण है जिसमें पूरे प्रोजेक्ट (या कई संबंधित प्रोजेक्ट्स) का कोड एक ही रिपॉजिटरी में संग्रहीत किया जाता है। polyrepo के विपरीत, जहाँ प्रत्येक घटक अलग-थलग होता है, monorepo लाइब्रेरीज़, एप्लिकेशन, टेस्ट, कॉन्फ़िगरेशन और दस्तावेज़ीकरण को एक ही संस्करण नियंत्रण के तहत एकीकृत करता है।
Swift डेवलपर्स के लिए, मोनोरेपॉजिटरी कई कारणों से विशेष रूप से प्रासंगिक है:
- निर्भरताओं का एकीकृत संस्करण: आप विभिन्न एप्लिकेशनों के बीच लाइब्रेरी संस्करणों के असंतुलन से बचते हैं।
- रीफैक्टरिंग को सरल बनाना: सामान्य मॉड्यूल में किए गए बदलाव रिपॉजिटरी के अंदर सभी उपभोक्ताओं को तुरंत दिखाई देते हैं।
- त्वरित एकीकरण: नई सुविधाओं का परीक्षण और रिलीज़ एक ही पुल-रिक्वेस्ट में किया जा सकता है।
- SPM के साथ संगतता: Swift Package Manager मोनोरेपॉजिटरीज़ के लिए आदर्श है, क्योंकि यह स्थानीय पैकेज और सापेक्ष पथों का समर्थन करता है।
Swift प्रोजेक्ट के लिए मोनोरेपॉजिटरी की संरचना
एक व्यावहारिक उदाहरण पर विचार करें। मान लीजिए कि हमारे पास iOS (SwiftUI पर) और macOS (AppKit पर) के लिए एक एप्लिकेशन है, जो सामान्य मॉड्यूल का उपयोग करता है: नेटवर्किंग लेयर, प्रमाणीकरण लॉजिक और UI घटक। मोनोरेपॉजिटरी को इस प्रकार व्यवस्थित करें:
MyMonorepo/├── Package.swift├── Sources/│ ├── AppiOS/│ │ └── main.swift│ ├── AppMacOS/│ │ └── main.swift│ ├── CoreNetworking/│ │ ├── Sources/│ │ │ └── HTTPClient.swift│ │ └── Tests/│ ├── CoreAuth/│ │ ├── Sources/│ │ │ └── AuthService.swift│ │ └── Tests/│ └── UIComponents/│ ├── Sources/│ │ └── CustomButton.swift│ └── Tests/├── Tests/│ ├── AppiOSTests/│ └── AppMacOSTests/├── .gitignore└── README.mdमुख्य फ़ाइल Package.swift है। यह सभी मॉड्यूल और उनकी निर्भरताओं का वर्णन करती है। ऐसी फ़ाइल का एक उदाहरण:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "MyMonorepo", platforms: [ .iOS(.v17), .macOS(.v14) ], products: [ .executable(name: "AppiOS", targets: ["AppiOS"]), .executable(name: "AppMacOS", targets: ["AppMacOS"]), .library(name: "CoreNetworking", targets: ["CoreNetworking"]), .library(name: "CoreAuth", targets: ["CoreAuth"]), .library(name: "UIComponents", targets: ["UIComponents"]) ], dependencies: [ // बाहरी निर्भरताएँ, यदि आवश्यक हों // .package(url: "https://github.com/...", from: "1.0.0") ], targets: [ .executableTarget( name: "AppiOS", dependencies: ["CoreNetworking", "CoreAuth", "UIComponents"], path: "Sources/AppiOS" ), .executableTarget( name: "AppMacOS", dependencies: ["CoreNetworking", "CoreAuth", "UIComponents"], path: "Sources/AppMacOS" ), .target( name: "CoreNetworking", dependencies: [], path: "Sources/CoreNetworking/Sources" ), .target( name: "CoreAuth",