مستودع واحد مع Swift: تنظيم الكود للمبتدئين
عندما تبدأ في تطوير تطبيقات Swift لنظامي iOS أو macOS، عاجلاً أم آجلاً ستواجه سؤالاً: كيف تنظم الكود بحيث لا يتحول إلى فوضى؟ خاصة إذا كان لديك عدة مشاريع (مثل تطبيق iOS، وإضافة watchOS، وجزء خادم باستخدام Vapor). أحد الأساليب الحديثة هو المستودع الواحد (monorepo). في هذه المقالة، سنشرح ما هو المستودع الواحد، ولماذا هو مفيد في تطوير Swift، وكيفية تنظيمه عملياً.
ما هو المستودع الواحد ولماذا هو مفيد؟
المستودع الواحد (monorepo) هو نهج لإدارة الكود حيث يتم تخزين جميع المشاريع والمكتبات والوحدات في مستودع واحد (مثل Git). على عكس المستودعات المتعددة، حيث يعيش كل مشروع في مستودع منفصل، يجمع المستودع الواحد كل شيء في مكان واحد.
لمطوري Swift، يوفر هذا عدة مزايا:
- إصدار موحد للتبعيات — تعرف بالضبط أي إصدار من المكتبة يُستخدم في جميع المشاريع.
- إعادة هيكلة مبسطة — تغيير API في مكتبة واحدة يظهر فوراً في جميع المشاريع التابعة.
- إعدادات مشتركة — SwiftLint واحد، تكوين CI/CD واحد، قواعد تنسيق واحدة.
- بحث سهل — كل شيء في مكان واحد، لا حاجة للتبديل بين المستودعات.
ومع ذلك، هناك بعض الفروق الدقيقة: المستودع الواحد يتطلب انضباطاً وهيكلاً صحيحاً، وإلا فإنه يتحول إلى "مكب نفايات". لكن للمبتدئين، هذه طريقة ممتازة لتعلم تنظيم الكود.
هيكل المستودع الواحد لمشاريع Swift
لنفترض أنك تقوم بإنشاء تطبيق iOS مع وحدات مشتركة. قد يبدو الهيكل النموذجي للمستودع الواحد في Swift كالتالي:
MyMonorepo/├── Apps/│ ├── iOSApp/ # تطبيق iOS الرئيسي│ │ ├── Sources/│ │ ├── Resources/│ │ └── Package.swift│ └── macOSApp/ # إصدار macOS│ ├── Sources/│ └── Package.swift├── Packages/│ ├── Core/ # أدوات مساعدة مشتركة (الشبكات، التسجيل)│ │ ├── Sources/│ │ └── Package.swift│ ├── UIComponents/ # مكونات واجهة مستخدم قابلة لإعادة الاستخدام│ │ ├── Sources/│ │ └── Package.swift│ └── Analytics/ # وحدة التحليلات│ ├── Sources/│ └── Package.swift├── Scripts/ # نصوص مساعدة├── .swiftlint.yml # تكوين مدقق الكود الموحد├── Package.swift # البيان الجذري (اختياري)└── README.mdلاحظ: هنا يتم استخدام Swift Package Manager (SPM) — الأداة القياسية لإدارة التبعيات في Swift. كل وحدة هي حزمة Swift منفصلة يمكن ربطها بالتطبيقات.
كيفية إنشاء مستودع واحد في Swift: دليل خطوة بخطوة
دعنا ننشئ مستودعاً واحداً بسيطاً بوحدتين وتطبيق واحد. اتبع الخطوات التالية في الطرفية:
الخطوة 1: أنشئ الدليل الجذري وقم بتهيئة Git
mkdir MyMonorepocd MyMonorepogit initالخطوة 2: أنشئ هيكل المجلدات
mkdir -p Apps/iOSApp/Sourcesmkdir -p Packages/Core/Sourcesmkdir -p Packages/UIComponents/Sourcesالخطوة 3: أنشئ ملف Package.swift لوحدة Core
أنشئ ملف Packages/Core/Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "Core", platforms: [ .iOS(.v16), .macOS(.v13) ], products: [ .library( name: "Core", targets: ["Core"]) ], targets: [ .target( name: "Core", path: "Sources") ])الخطوة 4: اكتب كوداً بسيطاً في وحدة Core
أنشئ Packages/Core/Source