स्विफ्ट के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

स्विफ्ट के साथ मोनोरिपॉजिटरी: व्यवहार में कोड का संगठन

\n\n

आधुनिक iOS-डेवलपमेंट तेजी से कोड बेस को स्केल करने की चुनौती का सामना कर रहा है। जब कोई प्रोजेक्ट दर्जनों मॉड्यूल, साझा लाइब्रेरी और कई एप्लिकेशन (iOS, macOS, watchOS) तक बढ़ जाता है, तो अलग-अलग रिपॉजिटरी (polyrepo) वाला पारंपरिक मॉडल डेवलपमेंट को धीमा करने लगता है। मोनोरिपॉजिटरी बचाव में आती है - एक एकल रिपॉजिटरी जिसमें इकोसिस्टम के सभी घटकों का कोड होता है। इस लेख में, हम व्यवहार में देखेंगे कि आधुनिक टूल्स: Swift Package Manager (SPM), Tuist और कुशल CI/CD पाइपलाइनों का उपयोग करके Swift प्रोजेक्ट्स के लिए मोनोरिपॉजिटरी कैसे व्यवस्थित करें।

\n\n

1. Swift इकोसिस्टम में मोनोरिपॉजिटरी की आवश्यकता क्यों है?

\n\n

कार्यान्वयन में गोता लगाने से पहले, दृष्टिकोण के प्रमुख लाभों को समझना महत्वपूर्ण है:

\n\n
    \n
  • एकीकृत संस्करण - सभी मॉड्यूल और एप्लिकेशन एक ही कमिट में हैं, जो "डिपेंडेंसी हेल" (dependency hell) की समस्या को समाप्त करता है।
  • \n
  • सरलीकृत रिफैक्टरिंग - लाइब्रेरी में API परिवर्तन सभी उपभोक्ताओं को तुरंत दिखाई देता है; कंपाइलर एक ही PR के भीतर त्रुटियों को उजागर करेगा।
  • \n
  • पारदर्शी नेविगेशन - डेवलपर्स रिपॉजिटरी के बीच स्विच किए बिना पूरे प्रोजेक्ट का कोड देखते हैं।
  • \n
  • CI/CD अनुकूलन - समय और संसाधनों की बचत करते हुए, केवल बदले गए मॉड्यूल (targeted builds) के बिल्ड को कॉन्फ़िगर किया जा सकता है।
  • \n
\n\n

हालाँकि, मोनोरिपॉजिटरी में अनुशासन की आवश्यकता होती है: स्पष्ट मॉड्यूलर आर्किटेक्चर और अराजकता को रोकने वाले टूल्स। Swift के लिए, आज सबसे अच्छा विकल्प Tuist है - एक उपयोगिता जो Xcode प्रोजेक्ट्स को घोषणात्मक रूप से प्रबंधित करती है, या मॉड्यूलर संरचना के लिए शुद्ध Swift Package Manager है।

\n\n

2. Swift Package Manager पर मोनोरिपॉजिटरी की संरचना

\n\n

आइए बुनियादी संगठन से शुरू करें। मान लीजिए, हमारे पास दो एप्लिकेशन हैं: MyAppiOS और MyAppMacOS, साथ ही आंतरिक लाइब्रेरी का एक सेट। फ़ाइल संरचना इस प्रकार दिख सकती है:

\n\n
Monorepo/\n├── Apps/\n│   ├── MyAppiOS/\n│   │   ├── Sources/\n│   │   └── Package.swift (या Tuist के लिए project.yml)\n│   └── MyAppMacOS/\n│       ├── Sources/\n│       └── Package.swift\n├── Libraries/\n│   ├── Networking/\n│   │   ├── Sources/\n│   │   └── Package.swift\n│   ├── UIComponents/\n│   │   ├── Sources/\n│   │   └── Package.swift\n│   └── Core/\n│       ├── Sources/\n│       └── Package.swift\n├── Tests/\n│   ├── NetworkingTests/\n│   └── UIComponentsTests/\n├── Package.swift (रूट मेनिफेस्ट)\n└── Tuist/ (यदि Tuist का उपयोग कर रहे हैं)\n    └── Project.swift\n
\n\n

रूट Package.swift सब कुछ एक साथ जोड़ता है। मेनिफेस्ट का उदाहरण:

\n\n
// swift-tools-version:5.9\nimport PackageDescription\n\nlet package = Package(\n    name: "MyMonorepo",\n    platforms: [\n        .iOS(.v16), .macOS(.v13)\n    ],\n    products: [\n        .library(name: "Networking", targets: ["Networking"]),\n        .library(name: "UIComponents", targets: ["UIComponents"]),\n        .library(name: "Core", targets: ["Core"]),\n        .executable(name: "MyAppiOS", targets: ["MyAppiOS"]),\n        .executable(name: "MyAppMacOS", targets: ["MyAppMacOS"])\n    ],\n    dependencies: [\n        // बाहरी निर्भरताएँ\n        .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0")\n    ],\n    targets: [\n        .target(\n            name: "Networking",\n            dependencies: ["Core", .product(name: "Alamofire", package: "Alamofire")],\n            path: "Libraries/Networking/Sources"\n        ),\n        .target(\n            name: "UIComponents",\n            dependencies: ["Core"],\n            path: "Libraries/UIComponents/Sources"\n        ),\n        .target(\n            name: "Core",\n            path: "Libraries/Core/Sources"\n        ),\n        .executableTarget(\n            name: "MyAppiOS",\n            dependencies: ["Networking", "UIComponents"],\n            path: "Apps/MyAppiOS/Sources"\n                

ब्लॉग

पुस्तक अनुशंसाएँ