المستودع الأحادي مع Swift: تنظيم الكود عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مستودع واحد (Monorepo) مع Swift: تنظيم الكود عمليًا



في تطوير iOS وmacOS الحديث، يعد اختيار استراتيجية إدارة الكود أحد العوامل الرئيسية التي تؤثر على قابلية التوسع وسرعة التسليم وجودة المنتج. تقليديًا، استخدم المطورون مستودعات متعددة (polyrepo)، حيث يعيش كل وحدة أو خدمة في مستودع Git منفصل. ومع ذلك، مع نمو المشاريع والفرق، يطرح السؤال بشكل متزايد: كيف ننظم الكود بحيث يبقى متكاملًا وقابلًا لإعادة الاستخدام وسهل الصيانة؟ الإجابة هي المستودع الواحد (monorepo) مع Swift. في هذه المقالة، سنشرح ما هو المستودع الواحد، ولماذا هو مناسب لمشاريع Swift، وكيفية تنظيمه عمليًا باستخدام Swift Package Manager (SPM).



ما هو المستودع الواحد ولماذا هو ضروري في Swift؟



المستودع الواحد هو نهج يتم فيه تخزين كل كود المشروع (أو عدة مشاريع مرتبطة) في مستودع واحد. على عكس polyrepo، حيث يكون كل مكون معزولًا، يقوم monorepo بدمج المكتبات والتطبيقات والاختبارات والتكوينات والوثائق تحت نسخة تحكم واحدة.



بالنسبة لمطوري Swift، يعتبر المستودع الواحد مهمًا بشكل خاص لعدة أسباب:

  • نسخة موحدة من التبعيات: تتجنب عدم تزامن إصدارات المكتبات بين التطبيقات المختلفة.
  • تبسيط إعادة الهيكلة: التغييرات في الوحدة المشتركة تكون مرئية فورًا لجميع المستهلكين داخل المستودع.
  • تكامل سريع: يمكن اختبار الميزات الجديدة وإصدارها في طلب سحب واحد.
  • التوافق مع SPM: Swift Package Manager مثالي للمستودعات الواحدة لأنه يدعم الحزم المحلية والمسارات النسبية.


هيكل المستودع الواحد لمشروع Swift



لننظر إلى مثال عملي. لنفترض أن لدينا تطبيقًا لنظام iOS (باستخدام SwiftUI) وآخر لنظام macOS (باستخدام AppKit)، وكلاهما يستخدم وحدات مشتركة: طبقة الشبكة، منطق المصادقة، ومكونات واجهة المستخدم. سننظم المستودع الواحد على النحو التالي:



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",

المدونات

توصيات الكتب