مستودع واحد مع C#: تنظيم الكود وأفضل الممارسات
في التطوير الحديث باستخدام C# (.NET)، يتم استخدام نهج المستودع الواحد (monorepo) بشكل متزايد. على عكس المستودعات المتعددة، حيث يعيش كل مشروع في مستودع Git الخاص به، يقوم المستودع الواحد بتخزين جميع أكواد الشركة أو المنتج في مستودع مركزي واحد. لمطوري .NET، هذا يعني حلًا واحدًا (solution)، ومكتبات مشتركة، وإعدادًا مبسطًا لـ CI/CD. في هذه المقالة، سنشرح كيفية تنظيم مستودع واحد مع C# بشكل صحيح، وسنقدم أمثلة على الكود، ونناقش المزايا الرئيسية.
1. مزايا المستودع الواحد لـ .NET
المستودع الواحد مفيد بشكل خاص للفرق التي تعمل على عدة مشاريع .NET مترابطة: الخدمات المصغرة، تطبيقات الويب، مكتبات الفئات. المزايا الرئيسية:
- إصدار موحد للتبعيات — تستخدم جميع المشاريع نفس إصدارات حزم NuGet، مما يمنع التعارضات.
- إعادة هيكلة مبسطة — يتم تطبيق تغيير واجهة مشتركة أو نموذج بيانات على جميع المستهلكين فورًا.
- تاريخ Git مشترك — الالتزامات الذرية التي تؤثر على عدة مشاريع تكون مرئية في مكان واحد.
- CI/CD مركزي — خط أنابيب واحد لبناء واختبار ونشر جميع المكونات.
بالنسبة لـ C#، يتم بناء المستودع الواحد حول ملف .sln واحد (solution)، والذي يشير إلى جميع المشاريع. هذا يسمح باستخدام الأدوات المدمجة في Visual Studio و .NET CLI لإدارة التبعيات.
2. هيكل المستودع الواحد لـ C#
لنفكر في هيكل نموذجي للمستودع الواحد لحل .NET. قد يبدو كالتالي:
MyCompany/├── src/│ ├── MyCompany.Common/ # مكتبة مشتركة│ │ ├── MyCompany.Common.csproj│ │ └── ...│ ├── MyCompany.WebApi/ # واجهة برمجة تطبيقات ويب│ │ ├── MyCompany.WebApi.csproj│ │ └── ...│ └── MyCompany.BackgroundJob/ # خدمة خلفية│ ├── MyCompany.BackgroundJob.csproj│ └── ...├── tests/│ ├── MyCompany.Common.Tests/│ ├── MyCompany.WebApi.Tests/│ └── MyCompany.BackgroundJob.Tests/├── docs/ # وثائق├── scripts/ # نصوص لـ CI/CD├── .gitignore└── MyCompany.sln # حل واحدالعناصر الرئيسية لهذا الهيكل:
- src/ — مجلد الكود المصدري. كل مشروع هو مجلد منفصل مع ملف .csproj الخاص به.
- tests/ — مجلد الاختبارات. أسماء مشاريع الاختبار تكرر أسماء المشاريع الرئيسية مع اللاحقة .Tests.
- docs/ — الوثائق (README، قرارات معمارية).
- scripts/ — نصوص لأتمتة البناء أو النشر.
- MyCompany.sln — ملف حل واحد يتضمن جميع المشاريع.
هذا الهيكل يبسط التنقل ويسمح بإضافة مشاريع جديدة بسهولة دون تغيير التكوين الجذري.
3. إعداد حل واحد وتبعيات مشتركة
لإنشاء مستودع واحد في .NET، استخدم الأمر dotnet new sln، ثم أضف المشاريع:
# إنشاء المجلد الجذر والانتقال إليهmkdir MyCompany && cd MyCompany
# إنشاء ملف حل فارغdotnet new sln -n MyCompany
# إنشاء هيكل المجلداتmkdir src tests docs scripts
# إنشاء المشاريعdotnet new classlib -n MyCompany.Common -o src/MyCompany.Commondotnet new webapi -n MyCompany.WebApi -o src/MyCompany.WebApidotnet new console -n MyCompany.BackgroundJob -o src/MyCompany.BackgroundJob
# إضافة المشاريع إلى الحلdotnet sln add src/MyCompany.Common/MyCompany.Common.csprojdotnet sln add src/MyCompany.WebApi/MyCompany.WebApi.csprojdotnet sln add src/MyCompany.BackgroundJob/MyCompany.BackgroundJob.csprojالآن، دعنا نضيف مرجعًا إلى المكتبة المشتركة من واجهة برمجة تطبيقات الويب: