دليل Turborepo Monorepo: إدارة المشاريع متعددة التطبيقات

Master Turborepo لإدارة monorepos متعدد التطبيقات. تعرف على تكوين مساحة العمل، ومسارات المهام، والتخزين المؤقت، والحزم المشتركة، وتحسين CI/CD للمشروعات واسعة النطاق.

E

ECOSIRE Research and Development Team

فريق ECOSIRE

5 مارس 20265 دقائق قراءة1.0k كلمات

دليل Turborepo Monorepo: إدارة المشاريع متعددة التطبيقات

**أصبحت Monorepos التي تحتوي على تطبيقات متعددة وحزم مشتركة الآن هي البنية القياسية للشركات التي تبني منتجات برمجية مترابطة. ** توفر Turborepo، التي استحوذت عليها Vercel، طبقة تنسيق البناء التي تجعل monorepos عملية - التعامل مع تبعيات المهام، والتخزين المؤقت، والتنفيذ المتوازي عبر عشرات الحزم.

الوجبات الرئيسية

  • يمكن أن يؤدي التخزين المؤقت عن بعد لـ Turborepo إلى تقليل أوقات إنشاء CI بنسبة 80-90% عند إجراء تغييرات تدريجية
  • تضمن مسارات المهام إنشاء الحزم بترتيب التبعية الصحيح تلقائيًا
  • تعمل الحزم المشتركة (الأنواع، وأدوات التحقق من الصحة، والأدوات المساعدة) على التخلص من تكرار التعليمات البرمجية عبر التطبيقات
  • توفر مساحات عمل pnpm إدارة تبعية فعالة للقرص من أجل monorepos

عمارة مونوريبو

هيكل الدليل

يقوم Turborepo monorepo النموذجي بفصل التطبيقات عن الحزم المشتركة:

my-monorepo/
  apps/
    api/           # NestJS backend
    web/           # Next.js frontend
    docs/          # Documentation site
    mobile/        # React Native app
  packages/
    db/            # Drizzle ORM schemas and migrations
    types/         # Shared TypeScript types
    validators/    # Zod validation schemas
    utils/         # Shared utility functions
    ui/            # Shared UI components
    config/        # Shared configuration (ESLint, TypeScript)
  turbo.json       # Turborepo configuration
  pnpm-workspace.yaml
  package.json     # Root package.json

تكوين مساحة العمل

تحديد مساحات العمل في pnpm-workspace.yaml:

packages:
  - "apps/*"
  - "packages/*"

تحتوي كل مساحة عمل على ملف package.json الخاص بها مع التبعيات والبرامج النصية. تتم الإشارة إلى الحزم المشتركة باستخدام بروتوكول مساحة العمل:

{
  "dependencies": {
    "@myorg/types": "workspace:*",
    "@myorg/validators": "workspace:*",
    "@myorg/utils": "workspace:*"
  }
}

تكوين توربوريبو

خط أنابيب المهام

يحدد Turbo.json كيفية ارتباط المهام ببعضها البعض:

{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "dev": {
      "dependsOn": ["^build"],
      "cache": false,
      "persistent": true
    },
    "lint": {
      "dependsOn": ["^build"]
    },
    "test": {
      "dependsOn": ["build"]
    }
  }
}

** المفاهيم الأساسية: **

  • dependsOn: ["^build"]: علامة الإقحام (^) تعني "إنشاء كافة التبعيات أولاً." عند إنشاء تطبيق الويب، تقوم Turborepo ببناء الحزم/الأنواع والحزم/أدوات التحقق والحزم/الأدوات أولًا.
  • المخرجات: الملفات التي يخزنها Turborepo مؤقتًا. في عمليات التشغيل اللاحقة، إذا لم تتغير المدخلات، يقوم Turborepo بإعادة تشغيل الإخراج المخزن مؤقتًا بدلاً من إعادة البناء.
  • المستمر: صحيح: لخوادم التطوير التي تستمر في العمل.
  • ذاكرة التخزين المؤقت: خطأ: تعطيل التخزين المؤقت للمهام التي يجب تشغيلها دائمًا (مثل خوادم التطوير).

الحزم المشتركة

حزمة الأنواع

مركزية أنواع TypeScript المستخدمة عبر التطبيقات:

// packages/types/src/user.ts
export interface User {
  id: string;
  email: string;
  name: string;
  role: "admin" | "user" | "support";
  createdAt: Date;
}

export type CreateUserDTO = Omit<User, "id" | "createdAt">;
export type UpdateUserDTO = Partial<CreateUserDTO>;

حزمة أدوات التحقق

مخططات Zod المشتركة بين الواجهة الأمامية والخلفية:

// packages/validators/src/user.ts
import { z } from "zod";

export const createUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(2).max(255),
  role: z.enum(["admin", "user", "support"]),
});

تكوين التكوين

يجب أن تكون الحزم المشتركة مُصممة مسبقًا قبل أن تتمكن التطبيقات من استهلاكها. قم بتكوين كل حزمة باستخدام برنامج نصي للإنشاء يقوم بترجمة TypeScript إلى JavaScript:

{
  "scripts": {
    "build": "tsc --project tsconfig.json",
    "dev": "tsc --watch"
  }
}

استراتيجية التخزين المؤقت

التخزين المؤقت المحلي

يقوم Turborepo بتخزين مخرجات المهمة مؤقتًا في Node_modules/.cache/turbo افتراضيًا. عندما تقوم بتشغيل Turbo Build ولم يتغير شيء، يقوم Turborepo بإعادة تشغيل الإخراج المخزن مؤقتًا بالمللي ثانية.

التخزين المؤقت عن بعد

بالنسبة لـ CI/CD، قم بتمكين التخزين المؤقت عن بعد لمشاركة عناصر البناء عبر أعضاء الفريق وتشغيل CI:

npx turbo login
npx turbo link

التخزين المؤقت عن بعد يعني أن البناء المكتمل على جهاز مطور واحد أو تشغيل CI متاح للجميع. التأثير كبير: تنخفض بنيات CI المتزايدة من 10 دقائق إلى أقل من دقيقة واحدة.


سير عمل التطوير

تشغيل جميع التطبيقات

pnpm dev       # Starts all apps and watches all packages

ينشئ Turborepo الحزم المشتركة أولاً (لأن التطوير يعتمد على ^build)، ثم يبدأ تشغيل خوادم تطوير التطبيقات بالتوازي. تؤدي التغييرات التي يتم إجراؤها على الحزم المشتركة إلى تشغيل عمليات إعادة البناء التي تنتشر إلى التطبيقات المستهلكة.

تشغيل تطبيقات محددة

pnpm dev --filter=web     # Only the web app and its dependencies
pnpm dev --filter=api     # Only the API and its dependencies

يعد التصفية أمرًا ضروريًا بالنسبة إلى monorepos الكبيرة حيث يكون بدء كل شيء غير ضروري.


تحسين CI/CD

الكشف عن الحزمة المتأثرة

يحدد Turborepo الحزم التي تم تغييرها منذ الالتزام الأخير ويقوم فقط بتشغيل المهام للحزم المتأثرة:

turbo build --filter=...[HEAD^1]

يتم تشغيل هذا الإصدار فقط للحزم التي تغيرت في الالتزام الأخير والحزم التابعة لها.

التنفيذ الموازي

يقوم Turborepo بتنفيذ مهام مستقلة بالتوازي. إذا لم تكن للحزم/الأنواع والحزم/الأدوات علاقة تبعية، فسيتم بناؤها في وقت واحد. يتكيف مستوى التزامن مع مراكز وحدة المعالجة المركزية المتاحة.


الأسئلة المتداولة

س: كم عدد الطرود التي يمكن لـ Turborepo monorepo التعامل معها؟

تتعامل Turborepo مع monorepos بمئات العبوات. يتحسن الأداء بشكل جيد لأنه يتم تحليل الرسم البياني للمهمة عند بدء التشغيل، ويعني التخزين المؤقت أن معظم الحزم تتخطى البناء على التغييرات المتزايدة.

س: هل يجب أن نستخدم pnpm أو npm لمساحات العمل؟

يوصى بشدة باستخدام pnpm لـ monorepos. يعمل متجره القابل للتوجيه على المحتوى على إلغاء تكرار التبعيات عبر الحزم، مما يوفر مساحة كبيرة على القرص ووقت التثبيت. تعد مساحات عمل pnpm أيضًا أكثر صرامة فيما يتعلق بتحليل التبعيات، حيث تلتقط إعلانات التبعيات المفقودة.

س: كيف نتعامل مع إصدارات Node.js المختلفة عبر التطبيقات؟

استخدم حقل المحركات في كل package.json لتحديد متطلبات إصدار Node.js. بالنسبة لاختلافات وقت التشغيل، قم بتكوين CI لاستخدام الإصدار المناسب لكل تطبيق.

س: هل يمكننا اعتماد Turborepo بشكل تدريجي؟

نعم. أضف Turbo.json إلى مشروع مساحة عمل pnpm موجود وقم بتكوين مسارات المهام. تستمر البرامج النصية الموجودة في العمل. يمكنك الحصول على التخزين المؤقت وتنسيق المهام على الفور دون إعادة الهيكلة.


ما هو التالي

يقوم Turborepo بتحويل تطوير monorepo من عبء الصيانة إلى مضاعف الإنتاجية. ابدأ بهيكل بسيط ونمو حسب متطلبات مشروعك.

اتصل بـ ECOSIRE للحصول على استشارات حول بنية monorepo، أو استكشف خدمات تكامل Odoo للحصول على بنيات تخطيط موارد المؤسسات (ERP) متعددة التطبيقات.


تم النشر بواسطة ECOSIRE - مساعدة الشركات على التوسع باستخدام حلول برمجيات المؤسسات.

E

بقلم

ECOSIRE Research and Development Team

بناء منتجات رقمية بمستوى المؤسسات في ECOSIRE. مشاركة رؤى حول تكاملات Odoo وأتمتة التجارة الإلكترونية وحلول الأعمال المدعومة بالذكاء الاصطناعي.

الدردشة على الواتساب