Murad web-də yalnız bir sətri düzəltdi, CI-dakı yoxlamalar isə yenə hər şeyi ardıcıl yığır və test edir: shared, ui, api, web. Nə api-yə, nə də shared-ə toxunmayan bir sətir üçün doqquz dəqiqə gözləmək. Paket meneceri burada kömək etməz: o, paketləri quraşdırır və bağlayır, amma nəyin artıq edildiyini xatırlamır. Bunun üçün tapşırıq orkestratorları var, onların ən geniş yayılmışı isə Turborepo-dur. Bu dərsdə onu quracaq, tapşırıq qrafikini və keşi anlayacaq, doqquz dəqiqənin necə bir neçə saniyəyə çevrildiyini görəcəksiniz.

Tapşırıq orkestratoru nə üçün lazımdır

pnpm -r run build əmri artıq asılılıqlardan asılı paketlərə doğru gedir, amma belə işə salmanın üç zəif yeri var.

  1. Yaddaş yoxdur. Mənbə kodu dəyişməyib, build isə yenə də yenidən icra olunur.
  2. Ya hamısı, ya heç nə. «Yalnız mənim dəyişikliyimin toxunduğunu yoxla» demək olmur.
  3. Nəticə bölüşdürülmür. Kompüterinizin yığdığını nə həmkarınız, nə də CI alır.

Turborepo — Rust dilində yazılmış sürətli proqramdır: package.json-dakı skriptləri asılılıq qrafikinə görə işə salır, mümkün olan hər şeyi paralel icra edir və nəticələri xatırlayır. O, pnpm-i əvəz etmir: pnpm asılılıqları quraşdırır və paketləri bağlayır, Turborepo isə tapşırıqları işə salır. O, iş sahəsinin kökünə bir dəfə qurulur. Paket meneceri haqqında məlumatı kökdəki package.json faylının packageManager sahəsindən götürür:

bash
pnpm add -D -w turbo
pnpm exec turbo --version

Kökdəki package.json-a sarğı skriptləri əlavə edin, .turbo qovluğunu isə .gitignore-a yazın — Turborepo keşi və logları orada saxlayır:

json
{
  "scripts": {
    "build": "turbo run build",
    "dev": "turbo run dev",
    "lint": "turbo run lint",
    "check-types": "turbo run check-types"
  },
  "devDependencies": {
    "turbo": "^2.11.0"
  }
}

💡 pnpm 12-də tapşırıqların ardıcıllığını Turborepo olmadan da tasks ayarı ilə təsvir etmək olar, eksperimental pnpm pipeline əmrində isə keş var. Turborepo hazır uzaq keşi və geniş əmr dəsti ilə hələ də ən geniş yayılmış seçimdir.

İki qrafik: paketlər və tapşırıqlar

Paket qrafiki özü qurulur: apps/web/package.json-da "@repo/shared": "workspace:*" yazılıbsa, web shared-dən asılıdır. Tapşırıq qrafikini isə turbo.json-da özünüz təsvir edirsiniz: hansı tapşırıq hansını gözləməlidir.

json
{
  "$schema": "https://turborepo.dev/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "inputs": ["$TURBO_DEFAULT$", ".env*"],
      "outputs": ["dist/**", ".next/**", "!.next/cache/**", "!.next/dev/**"]
    },
    "lint": {
      "dependsOn": ["^lint"]
    },
    "check-types": {
      "dependsOn": ["^check-types"]
    },
    "dev": {
      "dependsOn": ["^build"],
      "cache": false,
      "persistent": true
    }
  }
}

tasks içindəki hər tapşırıq paketlərin package.json faylındakı eyniadlı skriptlərlə bağlıdır. Əsas açarlar: