# Expo SDK 52 EAS Build: Production Workflow ve 2026 Deployment Rehberi
Mobil geliştirme dünyasında 2026'nın en kritik sorusu şu: "Uygulamayı nasıl deploy ediyorsun?" Artık Xcode'u açıp manuel archive yapmak, Android Studio'da Gradle scriptlerini debug etmek geride kaldı. Expo SDK 52 ve EAS Build ekosistemi, enterprise-grade bir CI/CD pipeline'ı kutudan çıkar çıkmaz sunuyor.
Bu rehberde sıfırdan production'a giden tüm yolu ele alacağız. İlk eas build komutundan TestFlight'a otomatik submit'e, OTA update branching stratejisinden monorepo desteğine kadar her şey burada.
Pro Tip: EAS Build'e geçmeden önce eas diagnostics komutunu çalıştırın. Mevcut project config'inizdeki potansiyel sorunları önceden tespit eder, ilk build'de saat kaybetmezsiniz.İçindekiler
- Expo SDK 52 Yenilikleri
- EAS Build Nedir ve Neden Önemli?
- eas.json Profil Sistemi
- Build Cache Optimizasyonu
- Custom Dev Client
- EAS Submit Workflow
- OTA Updates Stratejisi
- Environment Variable Yönetimi
- Monorepo Desteği
- Maliyet Analizi ve Tier Seçimi
1. Expo SDK 52 Yenilikleri
SDK 52, 2025 sonunda release olan ve 2026 için standart haline gelen major versiyon. Temel değişiklikler şunlar:
React Native 0.76 altyapısı: New Architecture artık varsayılan açık. Fabric renderer ve TurboModules production-ready duruma geldi. Eski bridge mimarisine geri dönmek için artık ekstra config gerekiyor.
Expo Router v4: File-based routing sistemi artık daha güçlü. Parallel routes, intercepting routes, API routes (server actions) desteği geldi.
expo-modules-core 2.0: Native module yazma deneyimi tamamen değişti. Swift ve Kotlin için yeni API, async event emitter'lar, TypeScript type generation otomatik.
Expo Go artık sadece SDK 52+: Eski SDK versiyonları için Expo Go çalışmıyor. Custom dev client zorunlu hale geliyor — ama bu aslında bir avantaj.
SDK güncellemesi için:
bash
1# SDK upgrade komutu2npx expo install expo@^52.0.03 4# Otomatik dependency migration5npx expo install --fix6 7# Breaking change check8npx expo-doctorexpo-doctor çıktısı oldukça değerli. Hangi paketlerin uyumsuz olduğunu, hangi native config değişikliklerinin gerektiğini listeler.
2. EAS Build Nedir ve Neden Önemli?
EAS (Expo Application Services) Build, Expo'nun cloud-based build servisi. Temel farkı şu: Build işlemi kendi makinenizde değil, Expo'nun cloud worker'larında çalışıyor.
Cloud Worker Spesifikasyonları (2026):
Platform | Worker | RAM | Disk |
|---|---|---|---|
iOS | macOS M1 Pro | 14 GB | 100 GB SSD |
Android | Linux x86_64 | 16 GB | 80 GB SSD |
M1 Pro worker'lar sayesinde iOS build süreleri önceki Intel worker'lara göre yaklaşık 2.3x hızlandı. Özellikle büyük projelerde bu fark belirgin.
Local machine'e kıyasla avantajları:
Kendi bilgisayarınızda iOS build yapmak için Mac'e ihtiyacınız var. Windows veya Linux kullanıcıları hiçbir zaman iOS build alamaz. EAS Build bu problemi ortadan kaldırıyor — herhangi bir makineye eas build yazıyorsunuz, Expo'nun M1 makinesi iOS binary'yi üretiyor.
Ayrıca "bende çalışıyor" problemleri de çözülüyor. Build environment tamamen deterministik: hangi Node versiyonu, hangi Xcode versiyonu, hangi Gradle versiyonu kullanıldığı eas.json'da sabitlenmiş.
bash
1# EAS CLI kurulum2npm install -g eas-cli3 4# Proje initialize5eas init6 7# Build başlat8eas build --platform ios --profile production3. eas.json Profil Sistemi
eas.json dosyası EAS Build'in kalbidir. Development, preview ve production için farklı profiller tanımlanır.
json
1{2 "cli": {3 "version": ">= 12.0.0",4 "appVersionSource": "remote"5 },6 "build": {7 "development": {8 "developmentClient": true,9 "distribution": "internal",10 "ios": {11 "simulator": false,12 "buildConfiguration": "Debug"13 },14 "android": {15 "buildType": "apk",16 "gradleCommand": ":app:assembleDebug"17 },18 "env": {19 "APP_ENV": "development",20 "API_URL": "https://dev-api.yourapp.com"21 },22 "cache": {23 "key": "dev-v1"24 }25 },26 "preview": {27 "distribution": "internal",28 "ios": {29 "buildConfiguration": "Release",30 "enterpriseProvisioning": "adhoc"31 },32 "android": {33 "buildType": "apk"34 },35 "env": {36 "APP_ENV": "staging",37 "API_URL": "https://staging-api.yourapp.com"38 }39 },40 "production": {41 "ios": {42 "buildConfiguration": "Release"43 },44 "android": {45 "buildType": "app-bundle"46 },47 "env": {48 "APP_ENV": "production"49 },50 "autoIncrement": "version",51 "cache": {52 "key": "prod-v1",53 "cacheDefaultPaths": true,54 "customPaths": [55 "node_modules/.cache",56 ".expo/cache"57 ]58 }59 }60 },61 "submit": {62 "production": {63 "ios": {64 "appleId": "[email protected]",65 "ascAppId": "1234567890",66 "appleTeamId": "ABCDEF1234"67 },68 "android": {69 "serviceAccountKeyPath": "./google-service-account.json",70 "track": "internal"71 }72 }73 }74}Profil detayları:
- development:: Custom dev client build. Simulator veya gerçek cihaz için debug build. Hot reload, network inspector, performans overlay çalışır.
- preview:: Internal distribution. TestFlight veya Play Store internal'a gerek kalmadan doğrudan QR kod ile cihaza yüklenebilir.
- production:: App Store / Play Store'a gidecek release build. App bundle (AAB) formatında, code signing otomatik.
4. Build Cache Optimizasyonu
EAS Build'in en güçlü özelliklerinden biri cache sistemi. Doğru yapılandırıldığında build süreleri dramatik düşer.
json
1{2 "build": {3 "production": {4 "cache": {5 "key": "prod-cache-v3",6 "cacheDefaultPaths": true,7 "customPaths": [8 "node_modules",9 "ios/Pods",10 ".expo/cache",11 "android/.gradle"12 ],13 "disabled": false14 }15 }16 }17}Cache key'i ne zaman değiştirmelisiniz?
- Native dependency eklediğinizde (yeni
package.jsondependency ileexpo install) - Podfile veya build.gradle'ı manuel değiştirdiğinizde
- Xcode veya Gradle versiyonu değiştiğinde
- Temiz build garantisi istediğinizde
Cache etkinliği izleme:
Build loglarında Cache hit veya Cache miss mesajlarını görürsünüz. Cache miss olduğunda build ~4 dakika sürerken, cache hit ile bu ~90 saniyeye düşebilir. iOS Pods cache özellikle kritik — CocoaPods install süreci kendi başına 2-3 dakika alabilir.
5. Custom Dev Client
Expo Go artık SDK 52'de custom native modüller çalıştıramıyor. Bunun yerine custom dev client kullanılıyor. Bu aslında projenize özel bir Expo Go — içinde tam olarak sizin native modülleriniz var.
bash
1# Dev client build2eas build --profile development --platform all3 4# Build bittikten sonra cihaza install5# iOS: build URL'inden .ipa indir, cihaza yükle6# Android: QR kod ile APK'yı direkt yükletypescript
1// app.json - dev client konfigürasyonu2{3 "expo": {4 "name": "MyApp",5 "slug": "my-app",6 "version": "1.0.0",7 "runtimeVersion": {8 "policy": "appVersion"9 },10 "updates": {11 "url": "https://u.expo.dev/your-project-id",12 "enabled": true,13 "checkAutomatically": "ON_LOAD",14 "fallbackToCacheTimeout": 015 },16 "plugins": [17 "expo-dev-client",18 "expo-router",19 [20 "expo-build-properties",21 {22 "ios": {23 "deploymentTarget": "16.0",24 "newArchEnabled": true25 },26 "android": {27 "compileSdkVersion": 35,28 "targetSdkVersion": 35,29 "minSdkVersion": 24,30 "newArchEnabled": true31 }32 }33 ]34 ]35 }36}Dev client bir kere yüklenince, her JavaScript değişikliği için yeniden build almanıza gerek yok. Sadece JS bundle değişir, native layer aynı kalır. Native bir şey değiştiğinde (yeni modül, config değişikliği) yeniden build alınır.
6. EAS Submit Workflow
Build tamam, şimdi store'a gönderme zamanı. EAS Submit bu adımı da otomatize ediyor.
iOS - TestFlight'a Otomatik Submit:
bash
1# Build sonrası direkt submit2eas build --platform ios --profile production --auto-submit3 4# Var olan build'i submit et5eas submit --platform ios --latest6 7# Belirli bir build ID ile8eas submit --platform ios --id abc123App Store Connect API key'i configure etmek gerekiyor:
bash
1# ASC API Key oluşturma (Apple Developer Portal'dan)2# Key ID, Issuer ID ve .p8 dosyası gerekli3 4eas credentials5# Interactive menüden iOS > App Store Connect API Key seçinAndroid - Play Store Internal Track:
bash
1# Play Store submit2eas submit --platform android --latest --profile productionGoogle Service Account JSON dosyası gerekiyor. Play Console'dan API access bölümünden oluşturulur. Bu dosyayı asla git'e commit etmeyin — eas secret kullanın.
GitHub Actions ile tam otomasyon:
yaml
1# .github/workflows/eas-build.yml2name: EAS Build and Submit3 4on:5 push:6 branches: [main]7 pull_request:8 branches: [main]9 10jobs:11 build:12 name: EAS Build13 runs-on: ubuntu-latest14 steps:15 - name: Checkout repository16 uses: actions/checkout@v417 18 - name: Setup Node.js19 uses: actions/setup-node@v420 with:21 node-version: 2022 cache: pnpm23 24 - name: Install pnpm25 uses: pnpm/action-setup@v326 with:27 version: 928 29 - name: Install dependencies30 run: pnpm install --frozen-lockfile31 32 - name: Setup EAS33 uses: expo/expo-github-action@v834 with:35 eas-version: latest36 token: ${{ secrets.EXPO_TOKEN }}37 38 - name: Build on EAS (PR preview)39 if: github.event_name == 'pull_request'40 run: eas build --platform all --profile preview --non-interactive41 42 - name: Build and Submit (main branch)43 if: github.ref == 'refs/heads/main'44 run: |45 eas build --platform all --profile production --non-interactive46 eas submit --platform all --latest --non-interactive47 env:48 EXPO_APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}Bu workflow ile her PR'da preview build, her main push'ta production build + submit otomatik çalışır.
7. OTA Updates Stratejisi
EAS Update (eski Expo Updates), JavaScript bundle'ını native binary'yi güncellemeden değiştirmenizi sağlar. App Store review bypass — kritik bir bug fix'i dakikalar içinde kullanıcılara ulaştırabilirsiniz.
runtimeVersion vs SDK Version:
json
1{2 "expo": {3 "runtimeVersion": {4 "policy": "appVersion"5 }6 }7}runtimeVersion hangi native binary ile hangi JS bundle'ın uyumlu olduğunu belirtir. Politikalar:
- appVersion:: app.json'daki version string'i (1.0.0, 1.1.0...)
- sdkVersion:: Expo SDK versiyonu
- nativeVersion:: Native code değişikliklerini otomatik track eder (önerilen)
Branching Stratejisi:
bash
1# Production update publish2eas update --branch production --message "Fix checkout crash"3 4# Staging test5eas update --branch staging --message "New feature test"6 7# Belirli bir channel'a yönlendirme8# app.json'da channel tanımlanmış olmalıtypescript
1// Uygulama içi update kontrolü2import * as Updates from "expo-updates";3 4async function checkForUpdates() {5 if (!Updates.isEnabled) {6 console.log("Updates disabled in development");7 return;8 }9 10 try {11 const update = await Updates.checkForUpdateAsync();12 13 if (update.isAvailable) {14 await Updates.fetchUpdateAsync();15 16 // Kullanıcıya sor veya kritikse direkt reload17 Alert.alert(18 "Güncelleme Hazır",19 "Yeni bir güncelleme yüklendi. Uygulamayı yeniden başlatmak ister misiniz?",20 [21 { text: "Sonra", style: "cancel" },22 {23 text: "Şimdi Yenile",24 onPress: () => Updates.reloadAsync(),25 },26 ]27 );28 }29 } catch (error) {30 // Update check başarısız — mevcut bundle ile devam et31 console.error("Update check failed:", error);32 }33}Rollback Stratejisi:
Bir update bozuk çıktıysa geri almak için:
bash
1# Son başarılı update'i bul2eas update:list --branch production3 4# Önceki update'e rollback5eas update:rollback --branch production --group OTA update sınırları: Native kod değişiklikleri (yeni modül ekleme, permission değişikliği, Podfile/Gradle değişikliği) OTA ile gönderilemez. Bunlar için yeni binary build gerekir.
8. Environment Variable Yönetimi
Production uygulamalarında API key'leri, secret'ları doğru yönetmek kritik. EAS'ın iki farklı mekanizması var.
Build-time secrets (eas secret):
bash
1# Secret ekle2eas secret:create --scope project --name STRIPE_SECRET_KEY --value sk_live_xxx3 4# Tüm secret'ları listele5eas secret:list6 7# Secret'ı sil8eas secret:delete --id secret-idBuild sırasında environment variable olarak erişilir, binary içine gömülmez. Server-side API call'larda kullanılan key'ler için ideal.
Client-side env variables (expo-constants):
typescript
1// app.config.ts - dynamic config2import { ExpoConfig, ConfigContext } from "expo/config";3 4export default ({ config }: ConfigContext): ExpoConfig => ({5 ...config,6 name: "MyApp",7 extra: {8 apiUrl: process.env.API_URL ?? "https://api.yourapp.com",9 stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY ?? "",10 sentryDsn: process.env.SENTRY_DSN ?? "",11 appEnv: process.env.APP_ENV ?? "production",12 eas: {13 projectId: "your-project-uuid",14 },15 },16});typescript
1// Constants kullanımı2import Constants from "expo-constants";3 4const API_URL = Constants.expoConfig?.extra?.apiUrl as string;5const IS_PRODUCTION = Constants.expoConfig?.extra?.appEnv === "production";6 7// Type-safe wrapper8interface AppConfig {9 apiUrl: string;10 stripePublishableKey: string;11 appEnv: "development" | "staging" | "production";12}13 14export function getAppConfig(): AppConfig {15 const extra = Constants.expoConfig?.extra;16 if (!extra) throw new Error("App config not available");17 18 return {19 apiUrl: extra.apiUrl,20 stripePublishableKey: extra.stripePublishableKey,21 appEnv: extra.appEnv,22 };23}Önemli güvenlik notu: extra alanındaki değerler JavaScript bundle'ına gömülür ve reverse engineering ile okunabilir. Asla private key, secret token gibi değerleri burada tutmayın. Sadece public API key'ler (Stripe publishable key, Sentry DSN, Analytics tracking ID) güvenli.
9. Monorepo Desteği
2026'da büyük React Native projeleri büyük çoğunlukla monorepo yapısında. EAS Build native monorepo desteği sunuyor.
swift
1my-monorepo/2├── apps/3│ ├── mobile/ # Expo uygulaması4│ │ ├── app.json5│ │ ├── eas.json6│ │ └── package.json7│ └── web/ # Next.js8├── packages/9│ ├── ui/ # Shared component library10│ ├── api-client/ # Shared API types11│ └── utils/ # Shared utilities12├── package.json13└── pnpm-workspace.yamljson
1{2 "build": {3 "production": {4 "node": {5 "version": "20.x"6 },7 "env": {8 "EXPO_NO_DOTENV": "1"9 }10 }11 }12}bash
1# Monorepo root'ta değil, app dizininde çalıştır2cd apps/mobile3eas build --platform ios --profile production4 5# Veya root'tan subdirectory belirterek6eas build --platform ios --profile production --work-dir apps/mobileyaml
1# pnpm-workspace.yaml2packages:3 - "apps/*"4 - "packages/*"Monorepo'da dikkat edilmesi gereken nokta: node_modules hoisting. pnpm ile shamefully-hoist=true veya public-hoist-pattern ayarları Expo için gerekebilir. .npmrc dosyasına:
ini
1public-hoist-pattern[]=*expo*2public-hoist-pattern[]=*react-native*3public-hoist-pattern[]=@react-native*10. Maliyet Analizi ve Tier Seçimi
EAS Build fiyatlandırması 2026 için:
Tier | Aylık Ücret | Concurrent Builds | iOS Build Dakikası | Android Build Dakikası |
|---|---|---|---|---|
Free | $0 | 1 | 30 dk/ay | 30 dk/ay |
Production | $99 | 10 | Sınırsız | Sınırsız |
Enterprise | Custom | Sınırsız | Sınırsız | Sınırsız |
Free tier ne zaman yeterli?
Solo developer, hobbyist projeler, ilk MVP. Ayda 30 dakika build süresine denk — yaklaşık 5-8 build.
Production tier ne zaman gerekli?
Aktif geliştirme aşamasındaki ticari proje. Günlük birden fazla build, CI/CD pipeline, team kullanımı. $99/ay maliyeti Xcode'u çalıştıracak Mac mini kiralamaktan (yaklaşık $150-200/ay) ucuz.
Alternatif: Self-hosted EAS Build
Enterprise tier yerine kendi runner'larınızı kullanabilirsiniz:
bash
1# Self-hosted runner kurulum (EAS Worker)2eas worker:create --platform ios3 4# Runner'ı başlatma (kendi Mac'inizde)5eas worker:runBu sayede $99/ay ödemeden kendi M1 Mac'inizi build worker olarak kullanabilirsiniz. Ama CI stability, uptime, paralel build yönetimi sizin sorumluluğunuzda.
bash
1# 1. Tüm native config doğru mu?2npx expo-doctor3 4# 2. Credentials hazır mı?5eas credentials6 7# 3. Environment variable'lar set edildi mi?8eas secret:list9 10# 4. runtimeVersion policy doğru mu?11# app.json kontrolü12 13# 5. Test build (preview profile)14eas build --platform all --profile preview15 16# 6. OTA update channel'ları configured mı?17eas channel:list18 19# 7. Son build sonrası production submit20eas build --platform all --profile production --auto-submitALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
yaml
1# .github/workflows/pr-preview.yml2name: PR Preview Build3 4on:5 pull_request:6 types: [opened, synchronize]7 8jobs:9 preview:10 runs-on: ubuntu-latest11 steps:12 - uses: actions/checkout@v413 14 - uses: expo/expo-github-action@v815 with:16 eas-version: latest17 token: ${{ secrets.EXPO_TOKEN }}18 19 - run: pnpm install --frozen-lockfile20 21 - name: Create preview build22 run: |23 eas build --platform all --profile preview --non-interactive --message "PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}"24 25 - name: Comment PR with build links26 uses: actions/github-script@v727 with:28 script: |29 github.rest.issues.createComment({30 issue_number: context.issue.number,31 owner: context.repo.owner,32 repo: context.repo.repo,33 body: "Build hazır! EAS Dashboard'dan indirin: https://expo.dev/accounts/your-account/projects/your-project/builds"34 })Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
dockerfile
1# eas-build.Dockerfile2FROM ubuntu:22.043 4# Node.js 205RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash -6RUN apt-get install -y nodejs7 8# pnpm9RUN npm install -g pnpm@910 11# Android SDK12ENV ANDROID_HOME=/opt/android-sdk13RUN mkdir -p $ANDROID_HOME/cmdline-tools14# ... Android SDK kurulumu15 16# Custom tools (özel signing tools, internal CLI, vb.)17RUN npm install -g @mycompany/deploy-clijson
1{2 "build": {3 "production": {4 "android": {5 "image": "your-registry/eas-build:latest"6 }7 }8 }9}Okuyucu Ödülü
EAS Build'de kendi Docker image'ınızı kullanabilirsiniz. Bu özellik henüz preview aşamasında ama son derece güçlü:
Sonuç
Expo SDK 52 ve EAS Build kombinasyonu, 2026'da mobil CI/CD'nin altın standardı. Manual archive ve submission süreçleri geride kaldı. Doğru yapılandırılmış bir EAS pipeline ile:
- Her commit'te otomatik build tetiklenebilir
- Her PR için test edilebilir preview build oluşturulabilir
- Critical bug fix'ler OTA update ile dakikalar içinde canlıya alınabilir
- iOS ve Android submit tamamen otomatize edilebilir
Başlangıç için en kritik adım eas.json profil yapılandırmasını doğru kurmak. Development, preview ve production ortamları net ayrıldıktan sonra geri kalan her şey bu temelin üzerine inşa ediliyor.
React Native geliştirme sürecinizi bir üst seviyeye taşımak istiyorsanız React Native vs Flutter karşılaştırmasına göz atabilirsiniz. AI araçlarıyla geliştirme verimliliğini nasıl artıracağınızı öğrenmek için Claude Computer Use API rehberini incelemenizi öneririm.
Faydalı kaynaklar:

