Turborepo Monorepo Kılavuzu: Çoklu Uygulama Projelerini Yönetme
Birden fazla uygulama ve paylaşılan paket içeren Monorepo'lar artık birbirine bağlı yazılım ürünleri geliştiren şirketler için standart mimaridir. Vercel tarafından satın alınan Turborepo, monorepo'ları pratik hale getiren yapı düzenleme katmanını sağlar; görev bağımlılıklarını, önbelleğe almayı ve düzinelerce pakette paralel yürütmeyi yönetir.
Önemli Çıkarımlar
- Turborepo uzaktan önbelleğe alma, artımlı değişikliklerde CI oluşturma sürelerini %80-90 oranında azaltabilir
- Görev hatları, paketlerin otomatik olarak doğru bağımlılık sırasına göre oluşturulmasını sağlar
- Paylaşılan paketler (türler, doğrulayıcılar, yardımcı programlar), uygulamalar arasında kod tekrarını ortadan kaldırır
- pnpm çalışma alanları monorepos için disk açısından verimli bağımlılık yönetimi sağlar
Monorepo Mimarisi
Dizin Yapısı
Tipik bir Turborepo monorepo, uygulamaları paylaşılan paketlerden ayırır:
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
Çalışma Alanı Yapılandırması
pnpm-workspace.yaml'da çalışma alanlarını tanımlayın:
packages:
- "apps/*"
- "packages/*"
Her çalışma alanının bağımlılıkları ve komut dosyalarını içeren kendi package.json'u vardır. Paylaşılan paketlere çalışma alanı protokolü kullanılarak başvurulur:
{
"dependencies": {
"@myorg/types": "workspace:*",
"@myorg/validators": "workspace:*",
"@myorg/utils": "workspace:*"
}
}
Turborepo Yapılandırması
Görev İşlem Hattı
turbo.json, görevlerin birbirleriyle nasıl ilişkili olduğunu tanımlar:
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"]
},
"dev": {
"dependsOn": ["^build"],
"cache": false,
"persistent": true
},
"lint": {
"dependsOn": ["^build"]
},
"test": {
"dependsOn": ["build"]
}
}
}
Anahtar kavramlar:
- dependsOn: ["^build"]: Düzeltme işareti (^), "önce tüm bağımlılıkları oluştur" anlamına gelir. Turborepo, web uygulamasını oluştururken öncelikle paketler/türler, paketler/doğrulayıcılar ve paketler/kullanıcılar oluşturur.
- çıkışlar: Turborepo'nun önbelleğe aldığı dosyalar. Sonraki çalıştırmalarda, girişler değişmediyse Turborepo, yeniden oluşturmak yerine önbelleğe alınan çıkışı yeniden oynatır.
- kalıcı: doğru: Çalışmaya devam eden geliştirme sunucuları için.
- cache: false: Her zaman çalışması gereken görevler (geliştirme sunucuları gibi) için önbelleğe almayı devre dışı bırakın.
Paylaşılan Paketler
Paket Çeşitleri
Uygulamalarda kullanılan TypeScript türlerini merkezileştirin:
// 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>;
Doğrulayıcılar Paketi
Ön uç ve arka uç arasında paylaşılan Zod şemaları:
// 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"]),
});
Yapı Yapılandırması
Paylaşılan paketlerin, uygulamaların bunları kullanabilmesi için önceden oluşturulmuş olması gerekir. Her paketi TypeScript'i JavaScript'e derleyen bir derleme komut dosyasıyla yapılandırın:
{
"scripts": {
"build": "tsc --project tsconfig.json",
"dev": "tsc --watch"
}
}
Önbelleğe Alma Stratejisi
Yerel Önbelleğe Alma
Turborepo, görev çıktılarını varsayılan olarak node_modules/.cache/turbo konumunda önbelleğe alır. Turbo build'i çalıştırdığınızda ve hiçbir şey değişmediğinde, Turborepo önbelleğe alınan çıktıyı milisaniyeler içinde yeniden oynatır.
Uzaktan Önbelleğe Alma
CI/CD için derleme yapıtlarını ekip üyeleri ve CI çalıştırmaları arasında paylaşmak üzere uzaktan önbelleğe almayı etkinleştirin:
npx turbo login
npx turbo link
Remote caching means a build completed on one developer machine or CI run is available to everyone. Etki çarpıcı: Artımlı CI oluşturma süresi 10 dakikadan 1 dakikanın altına düştü.
Geliştirme İş Akışı
Tüm Uygulamaları Çalıştırma
pnpm dev # Starts all apps and watches all packages
Turborepo önce paylaşılan paketler oluşturur (çünkü dev, ^buildOn'a bağlıdır), ardından uygulama geliştirme sunucularını paralel olarak başlatır. Paylaşılan paketlerde yapılan değişiklikler, tüketen uygulamalara yayılan yeniden oluşturmaları tetikler.
Belirli Uygulamaları Çalıştırma
pnpm dev --filter=web # Only the web app and its dependencies
pnpm dev --filter=api # Only the API and its dependencies
Her şeyi başlatmanın gereksiz olduğu büyük monorepolar için filtreleme önemlidir.
CI/CD Optimizasyonu
Etkilenen Paket Tespiti
Turborepo, son işlemeden bu yana hangi paketlerin değiştiğini belirler ve yalnızca etkilenen paketler için görevleri çalıştırır:
turbo build --filter=...[HEAD^1]
Bu, yalnızca en son taahhütte değişen paketler ve bunların bağımlıları için derlemeyi çalıştırır.
Paralel Yürütme
Turborepo bağımsız görevleri paralel olarak yürütür. Paketler/türler ve paketler/yardımcı programların bağımlılık ilişkisi yoksa eş zamanlı olarak oluşturulurlar. Eşzamanlılık düzeyi mevcut CPU çekirdeklerine uyum sağlar.
Sıkça Sorulan Sorular
S: Bir Turborepo monorepo kaç paketi işleyebilir?
Turborepo, monorepoları yüzlerce paketle yönetiyor. Görev grafiği başlangıçta analiz edildiğinden performans iyi ölçeklenir ve önbelleğe alma, çoğu paketin artımlı değişikliklere dayalı derlemeleri atlaması anlamına gelir.
S: Çalışma alanları için pnpm mi yoksa npm mi kullanmalıyız?
Monorepos için pnpm şiddetle tavsiye edilir. İçerik adreslenebilir deposu, paketler arasındaki bağımlılıkları tekilleştirerek önemli miktarda disk alanı ve kurulum süresi tasarrufu sağlar. pnpm çalışma alanları ayrıca bağımlılık çözümü konusunda daha katıdır ve eksik bağımlılık bildirimlerini yakalar.
S: Uygulamalardaki farklı Node.js sürümlerini nasıl ele alacağız?
Node.js sürüm gereksinimlerini belirtmek için her package.json dosyasındaki motorlar alanını kullanın. Çalışma zamanı farklılıkları için CI'yı uygulama başına uygun sürümü kullanacak şekilde yapılandırın.
S: Turborepo'yu aşamalı olarak benimseyebilir miyiz?
Evet. Mevcut bir pnpm çalışma alanı projesine turbo.json ekleyin ve görev işlem hatlarını yapılandırın. Mevcut scriptler çalışmaya devam ediyor. You gain caching and task orchestration immediately without restructuring.
Sırada Ne Var
Turborepo, monorepo gelişimini bir bakım yükünden verimlilik çarpanına dönüştürüyor. Basit bir yapıyla başlayın ve projenizin gerektirdiği şekilde büyüyün.
Monorepo mimarisi danışmanlığı için ECOSIRE ile iletişime geçin veya çoklu uygulama ERP mimarileri için Odoo entegrasyon hizmetlerimizi keşfedin.
ECOSIRE tarafından yayınlandı - işletmelerin kurumsal yazılım çözümleriyle ölçeklenmesine yardımcı oluyor.
Yazan
ECOSIRE Research and Development Team
ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.
İlgili Makaleler
Docker Odoo Dağıtımı: Üretime Hazır Container Kurulumu
Odoo'yu üretim için Docker konteynerlerine dağıtın. Docker Compose yapılandırmasını, PostgreSQL kurulumunu, Nginx ters proxy'yi, SSL'yi, yedeklemeleri ve ölçeklendirmeyi kapsayan eksiksiz kılavuz.
Drizzle ORM ve NestJS ile API'ler Oluşturma: Tam Kılavuz
Drizzle ORM ve NestJS ile tür açısından güvenli API'ler oluşturun. Üretim uygulamalarına yönelik şema tanımını, geçişleri, sorgu oluşturmayı, ilişkileri, işlemleri ve test modellerini öğrenin.
Oyun Yazarı Test Kılavuzu: Next.js Uygulamaları için E2E Testleri
Playwright ile Next.js uygulamaları için güvenilir uçtan uca testler yazın. Kurulumu, sayfa nesnelerini, kimlik doğrulama testini, görsel regresyonu ve CI/CD entegrasyonunu kapsayan eksiksiz kılavuz.