blog.posts.turborepo-monorepo-guide.title

blog.posts.turborepo-monorepo-guide.description

E

ECOSIRE Research and Development Team

ECOSIRE ٹیم

5 مارچ، 20266 منٹ پڑھیں1.2k الفاظ

Turborepo Monorepo گائیڈ: ملٹی ایپ پروجیکٹس کا انتظام

**ایک سے زیادہ ایپلی کیشنز اور مشترکہ پیکجوں پر مشتمل Monorepos اب ایک دوسرے سے جڑے ہوئے سافٹ ویئر پروڈکٹس بنانے والی کمپنیوں کے لیے معیاری فن تعمیر ہے۔ ** Vercel کے ذریعے حاصل کیا گیا، ٹربوریپو بلڈ آرکیسٹریشن پرت فراہم کرتا ہے جو monorepos کو عملی بناتا ہے -- کام کے انحصار کو سنبھالنا، کیشنگ، اور درجنوں پیکجوں میں متوازی عمل درآمد۔

اہم ٹیک ویز

  • ٹربورپو ریموٹ کیشنگ اضافی تبدیلیوں پر 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/*"

ہر ورک اسپیس کا اپنا پیکیج.json ہوتا ہے جس میں انحصار اور اسکرپٹ ہوتے ہیں۔ Shared packages are referenced using the workspace protocol:

{
  "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 پہلے پیکجز/قسم، پیکجز/ویلیڈیٹرز، اور پیکجز/یوٹیلز بناتا ہے۔
  • outputs: Files that Turborepo caches. بعد کے رن پر، اگر ان پٹ تبدیل نہیں ہوئے ہیں، تو ٹربورپو دوبارہ بنانے کے بجائے کیش شدہ آؤٹ پٹ کو دوبارہ چلاتا ہے۔
  • مسلسل: سچ: ڈیو سرورز کے لیے جو چلتے رہتے ہیں۔
  • کیشے: غلط: ان کاموں کے لیے کیشنگ کو غیر فعال کریں جو ہمیشہ چلنا چاہیے (جیسے دیو سرورز)۔

مشترکہ پیکجز

اقسام کا پیکیج

تمام ایپس میں استعمال ہونے والی ٹائپ اسکرپٹ کی اقسام کو سنٹرلائز کریں:

// 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 کو جاوا اسکرپٹ میں مرتب کرتا ہے:

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

کیشنگ کی حکمت عملی

مقامی کیشنگ

Turborepo ڈیفالٹ کے طور پر node_modules/.cache/turbo میں ٹاسک آؤٹ پٹ کو کیش کرتا ہے۔ جب آپ ٹربو بلڈ چلاتے ہیں اور کچھ بھی نہیں بدلا ہے، تو ٹربوریپو کیش شدہ آؤٹ پٹ کو ملی سیکنڈ میں دوبارہ چلاتا ہے۔

ریموٹ کیشنگ

CI/CD کے لیے، ٹیم کے اراکین اور CI رنز کے درمیان تعمیراتی نمونے کا اشتراک کرنے کے لیے ریموٹ کیشنگ کو فعال کریں:

npx turbo login
npx turbo link

ریموٹ کیشنگ کا مطلب ہے کہ ایک ڈویلپر مشین پر مکمل کی گئی تعمیر یا CI رن ہر ایک کے لیے دستیاب ہے۔ اثر ڈرامائی ہے: بڑھتا ہوا CI 10 منٹ سے 1 منٹ سے کم تک گرتا ہے۔


ترقیاتی ورک فلو

تمام ایپس چلا رہے ہیں۔

pnpm dev       # Starts all apps and watches all packages

Turborepo پہلے مشترکہ پیکجز بناتا ہے (کیونکہ dev انحصار کرتا ہے ^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 متوازی طور پر آزاد کام چلاتا ہے۔ اگر پیکجز/قسم اور پیکجز/یوٹیلز کا کوئی انحصار تعلق نہیں ہے، تو وہ بیک وقت بنتے ہیں۔ The concurrency level adapts to available CPU cores.


اکثر پوچھے گئے سوالات

سوال: ٹربورپو مونوریپو کتنے پیکجوں کو سنبھال سکتا ہے؟

Turborepo سینکڑوں پیکجوں کے ساتھ monorepos کو ہینڈل کرتا ہے۔ کارکردگی کا پیمانہ بہتر ہوتا ہے کیونکہ ٹاسک گراف کا سٹارٹ اپ پر تجزیہ کیا جاتا ہے، اور کیشنگ کا مطلب ہے کہ زیادہ تر پیکجز اضافی تبدیلیوں پر بنتے ہیں۔

س: کیا ہمیں ورک اسپیس کے لیے pnpm یا npm استعمال کرنا چاہیے؟

monorepos کے لیے pnpm کی سختی سے سفارش کی جاتی ہے۔ اس کا مواد ایڈریس ایبل اسٹور تمام پیکجوں میں انحصار کو ڈیپلیکیٹ کرتا ہے، جس سے ڈسک کی اہم جگہ اور انسٹالیشن کے وقت کی بچت ہوتی ہے۔ pnpm ورک اسپیسز انحصار کے حل کے بارے میں بھی زیادہ سخت ہیں، گمشدہ انحصار کے اعلانات کو پکڑتے ہیں۔

س: ہم ایپس میں مختلف Node.js ورژن کو کیسے ہینڈل کرتے ہیں؟

Node.js ورژن کی ضروریات بتانے کے لیے ہر package.json میں انجن فیلڈ کا استعمال کریں۔ رن ٹائم کے فرق کے لیے، فی ایپ مناسب ورژن استعمال کرنے کے لیے CI کو کنفیگر کریں۔

س: کیا ہم بتدریج ٹربورپو کو اپنا سکتے ہیں؟

جی ہاں turbo.json کو موجودہ pnpm ورک اسپیس پروجیکٹ میں شامل کریں اور ٹاسک پائپ لائنز کو ترتیب دیں۔ Existing scripts continue to work. آپ تنظیم نو کے بغیر فوری طور پر کیشنگ اور ٹاسک آرکیسٹریشن حاصل کرتے ہیں۔


آگے کیا ہے۔

Turborepo monorepo کی ترقی کو دیکھ بھال کے بوجھ سے پیداواری ضرب میں تبدیل کرتا ہے۔ ایک سادہ ڈھانچے کے ساتھ شروع کریں اور اپنے پروجیکٹ کے تقاضوں کے مطابق بڑھیں۔

ECOSIRE سے رابطہ کریں monorepo فن تعمیر سے متعلق مشاورت کے لیے، یا ہماری Odoo انٹیگریشن سروسز کو ملٹی ایپ ERP آرکیٹیکچرز کے لیے دریافت کریں۔


ECOSIRE کے ذریعہ شائع کیا گیا -- انٹرپرائز سوفٹ ویئر کے حل کے ساتھ کاروبار کو پیمانے میں مدد کرنا۔

E

تحریر

ECOSIRE Research and Development Team

ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔

Chat on WhatsApp