spinny:~/writing $ vim monorepo-vs-polyrepo.md
1~2عند العمل على مشاريع برمجية معقدة، يمكن أن يكون للاختيار بين Monorepo و Polyrepo تأثير كبير على إنتاجية الفريق وقابلية تطوير الكود. في هذا المقال، نحلل الفروق، الإيجابيات والسلبيات لكل نهج، ونساعدك على فهم الأنسب لك.3~4## ما هما Monorepo و Polyrepo؟5~6### Monorepo7~8**Monorepo** (مستودع أحادي) هو مستودع واحد يحتوي على الشيفرة المصدرية لعدة مشاريع أو خدمات أو حزم، غالبًا ما تكون مترابطة.9~10```plaintext filename="مثال على هيكل Monorepo"11my-monorepo/12 packages/13 frontend/14 backend/15 shared/16 package.json17 turbo.json18```19~20### Polyrepo21~22**Polyrepo** (مستودعات متعددة) يعني أن كل مشروع أو خدمة أو حزمة لها مستودع منفصل خاص بها.23~24```plaintext filename="مثال على هيكل Polyrepo"25repos/26 frontend/27 package.json28 backend/29 package.json30 shared/31 package.json32```33~34## الفرق البصري35~36```mermaid37flowchart TD38 subgraph Monorepo39 A1["frontend/"]40 A2["backend/"]41 A3["shared/"]42 end43 style Monorepo fill:#e0e7ff,stroke:#6366f1,stroke-width:2px44```45~46```mermaid47flowchart TD48 subgraph Polyrepo49 B1["frontend repo"]50 B2["backend repo"]51 B3["shared repo"]52 end53 style Polyrepo fill:#fee2e2,stroke:#ef4444,stroke-width:2px54```55~56## الإيجابيات والسلبيات57~58### Monorepo59~60**الإيجابيات:**61- يسهل مشاركة الكود (مثل المكتبات المشتركة).62- إعادة هيكلة شاملة عبر مشاريع متعددة.63- إدارة مركزية للاعتمادات والإعدادات.64~65**السلبيات:**66- قد يصبح ضخمًا مع نمو الكود.67- يتطلب أدوات لإدارة البناء/الاختبار الجزئي (مثل Nx، Turborepo).68~69### Polyrepo70~71**الإيجابيات:**72- كل فريق/مشروع مستقل.73- أسهل في الإدارة للمشاريع الصغيرة.74- يسمح بسياسات وصول دقيقة.75~76**السلبيات:**77- صعوبة مشاركة الكود بدون نشر الحزم.78- إعادة هيكلة عبر المستودعات أكثر تعقيدًا.79- احتمال تكرار الإعدادات.80~81## مثال عملي: Monorepo مع Turborepo82~83افترض أنك تريد إنشاء Monorepo يحتوي على الواجهة الأمامية والخلفية باستخدام Turborepo.84~85### 1. تهيئة Monorepo86~87```bash88npx create-turbo@latest89```90~91### 2. الهيكل النموذجي92~93```plaintext94my-monorepo/95 apps/96 web/ # الواجهة الأمامية Next.js97 api/ # الواجهة الخلفية Node.js/Express98 packages/99 ui/ # مكتبة المكونات المشتركة100 utils/ # دوال مشتركة101 turbo.json102 package.json103```104~105### 3. مثال workspace في `package.json`106~107```json108{109 "private": true,110 "workspaces": [111 "apps/*",112 "packages/*"113 ]114}115```116~117### 4. مثال على استيراد مكتبة مشتركة118~119افترض أن لديك دالة في `packages/utils/src/formatDate.ts`:120~121```ts122// packages/utils/src/formatDate.ts123export function formatDate(date: Date): string {124 return date.toLocaleDateString('ar-EG');125}126```127~128في الواجهة الأمامية:129~130```ts131// apps/web/pages/index.tsx132import { formatDate } from '@myorg/utils';133~134export default function Home() {135 return <div>اليوم هو {formatDate(new Date())}</div>;136}137```138~139## متى تختار Monorepo؟140~141- فرق متوسطة إلى كبيرة تعمل على مشاريع مترابطة.142- الحاجة لمشاركة الكود وإعادة هيكلة واسعة النطاق.143- مشاريع تنمو بسرعة وتتطلب بناء/اختبار محسن.144~145## متى تختار Polyrepo؟146~147- مشاريع صغيرة أو مستقلة.148- فرق منفصلة تعمل على منتجات مختلفة.149- سياسات وصول شديدة التقييد.150~151## الخلاصة152~153لا توجد حل مثالي للجميع. يعتمد الاختيار على حجم الفريق، وتعقيد المشاريع، واحتياجات التعاون. الأهم هو إدراك المزايا والعيوب واختيار الأدوات المناسبة لإدارة التعقيد.
NORMAL · monorepo-vs-polyrepo.md [readonly]153 lines · :q to close