مستودع واحد مع C#: تنظيم الكود عمليًا

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

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

ابدأ الدورة

مستودع واحد مع C#: تنظيم الكود عمليًا

\n\n

في التطوير الحديث بلغة C# (.NET)، يبرز بشكل متزايد سؤال الاختيار بين المستودع الواحد (monorepo) والمستودعات المتعددة (multirepo). المستودع الواحد هو نهج يتم فيه تخزين الكود الكامل لعدة مشاريع ومكتبات وخدمات في مستودع Git واحد. في هذه المقالة، سنشرح كيفية تنظيم مستودع واحد لحلول C#، وسنستعرض أمثلة عملية للهيكل، وإعداد البناء، وإدارة التبعيات.

\n\n

مزايا المستودع الواحد لـ C#

\n\n

المستودع الواحد مفيد بشكل خاص عندما يكون لديك عدة مشاريع مترابطة: واجهات برمجة تطبيقات ويب، تطبيقات وحدة التحكم، مكتبات الفئات، والاختبارات. المزايا الرئيسية:

\n
    \n
  • إصدار موحد للتبعيات — تستخدم جميع المشاريع نفس الإصدار من حزم NuGet والمكتبات الداخلية.
  • \n
  • إعادة هيكلة مبسطة — تغيير API في مكتبة واحدة يظهر فورًا في جميع المستهلكين.
  • \n
  • CI/CD مركزي — خط أنابيب واحد لبناء واختبار ونشر جميع المكونات.
  • تقليل التكرار — يتم نقل النماذج والأدوات والإعدادات المشتركة إلى مشاريع مشتركة.
\n\n

ومع ذلك، يجب مراعاة العيوب: زيادة حجم المستودع، وزيادة وقت الاستنساخ (إذا لم يتم استخدام السحب الانتقائي sparse checkout)، بالإضافة إلى الحاجة إلى نظام مدروس لأذونات الوصول.

\n\n

هيكل المستودع الواحد بلغة C#

\n\n

لنستعرض هيكلًا نموذجيًا للمستودع الواحد لمشروع .NET. لنفترض أن لدينا خدمات مصغرة AuthService و OrderService ومكتبة مشتركة Shared.

\n\n
MyMonorepo/\n├── .github/\n│   └── workflows/\n│       └── ci.yml\n├── src/\n│   ├── AuthService/\n│   │   ├── AuthService.Api/\n│   │   │   ├── Controllers/\n│   │   │   ├── Program.cs\n│   │   │   └── AuthService.Api.csproj\n│   │   └── AuthService.Tests/\n│   │       └── AuthService.Tests.csproj\n│   ├── OrderService/\n│   │   ├── OrderService.Api/\n│   │   │   └── OrderService.Api.csproj\n│   │   └── OrderService.Tests/\n│   │       └── OrderService.Tests.csproj\n│   └── Shared/\n│       ├── Shared.Models/\n│       │   └── Shared.Models.csproj\n│       └── Shared.Utils/\n│           └── Shared.Utils.csproj\n├── tests/\n│   └── IntegrationTests/\n│       └── IntegrationTests.csproj\n├── MyMonorepo.sln\n├── Directory.Build.props\n├── Directory.Packages.props\n├── .gitignore\n└── README.md
\n\n

العناصر الرئيسية:

\n
    \n
  • src/ — المجلد الرئيسي للكود المصدري.
  • \n
  • tests/ — اختبارات التكامل، إذا لم تكن مرتبطة بخدمة معينة.
  • Directory.Build.props — إعدادات MSBuild المشتركة لجميع المشاريع.
  • Directory.Packages.props — إدارة مركزية لإصدارات حزم NuGet (وضع إدارة الحزم المركزية Central Package Management).
  • .sln — ملف الحل الذي يدمج جميع المشاريع.
\n\n

إعداد إدارة التبعيات المركزية

\n\n

في .NET 6+، ظهر دعم مدمج لـ إدارة الحزم المركزية (CPM). هذا مثالي للمستودع الواحد. قم بإنشاء ملف Directory.Packages.props في الجذر:

\n\n
<Project>\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageVersion Include="Microsoft.AspNetCore.App" Version="8.0.0" />\n    <PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />\n    <PackageVersion Include="xunit" Version="2.7.0" />\n  </ItemGroup>\n</Project>
\n\n

الآن في كل ملف .csproj، يكفي تحديد اسم الحزمة فقط بدون إصدار:

\n\n
<Project Sdk="Microsoft.NET.Sdk.Web">\n  <PropertyGroup>\n    <TargetFramework>n                

المدونات

توصيات الكتب