Fundamentos de Prebuild
Diez ejemplos para generar ios/ y android/ desde la configuración de Expo sin desvío manual - la base de Continuous Native Generation (CNG) en Expo SDK 57 y React Native 0.86.
Busca en todas las páginas de la documentación
Diez ejemplos para generar ios/ y android/ desde la configuración de Expo sin desvío manual - la base de Continuous Native Generation (CNG) en Expo SDK 57 y React Native 0.86.
Comienza desde una aplicación Expo en blanco con SDK 57 fijado. Prebuild lee app.config.ts, aplica plugins de configuración y escribe proyectos nativos:
npx create-expo-app@latest PrebuildBasics --template blank-typescript@sdk-57 --yes
cd PrebuildBasicsConfirma el pin de la pila antes de ejecutar prebuild:
{
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}Herramientas: Estos ejemplos están dirigidos a Expo SDK 57 (
expo~57.0.4), React Native 0.86.0 y React 19.2.3. Lee Native Module Rules antes de agregar dependencias nativas.
npx expo prebuild es el bridge entre tu configuración JavaScript y proyectos Xcode/Gradle. Lo que hace:
app.config.ts (o app.json)ios/ y android/Info.plist, AndroidManifest.xml, Gradle y Podfilenpx expo prebuildDespués de una ejecución exitosa:
PrebuildBasics/
├── app.config.ts
├── ios/ # Generado - no editar manualmente bajo CNG
├── android/ # Generado - no editar manualmente bajo CNG
└── package.jsonios/ y android/ - EAS Build ejecuta el mismo paso de prebuild en CIexpo prebuild --clean (el default de SDK 57)Prebuild necesita identificadores de paquete, nombre de visualización y rutas de iconos como mínimo:
// app.config.ts
import type { ExpoConfig } from "expo/config";
const config: ExpoConfig = {
name: "PrebuildBasics",
slug: "prebuild-basics",
version: "1.0.0",
orientation: "portrait",
icon: "./assets/icon.png",
scheme: "prebuildbasics",
userInterfaceStyle: "automatic",
ios: {
bundleIdentifier: "com.example.prebuildbasics",
supportsTablet: true,
},
android: {
package: "com.example.prebuildbasics",
adaptiveIcon: {
foregroundImage: "./assets/adaptive-icon.png",
backgroundColor: "#ffffff",
},
},
};
export default config;npx expo prebuild --no-install--no-install omite pod install y Gradle sync - útil para comprobaciones de diff de CInpx expo config --type public imprime el manifiesto resuelto sin escribir carpetas nativasPRODUCT_BUNDLE_IDENTIFIER y applicationId generadosLos proyectos CNG estándar no confirman directorios nativos generados:
# .gitignore (patrón CNG)
ios/
android/# Verifica que prebuild reproduce el mismo árbol localmente
rm -rf ios android
npx expo prebuild --no-installios/ comprometido de SDK 56 bloquea plantillas de RN 0.86 en upgrade - elimina y regeneraRelacionado: ../expo-rules/expo-project-rules-checklist/expo-project-rules-checklist.md - gitignore de CNG es un no-negociable de Tier 3
En SDK 57, expo prebuild elimina ios/ y android/ existentes antes de regenerar:
# Comportamiento por defecto (SDK 57): limpiar luego generar
npx expo prebuild
# Optar por no participar: capas de cambios en proyectos nativos existentes
npx expo prebuild --no-clean| Flag | Comportamiento |
|---|---|
| (default) | Elimina ios/ y android/, luego genera proyectos frescos |
--no-clean | Mantiene carpetas existentes; aplica actualizaciones de plantilla incrementalmente |
--platform ios | Genera solo iOS |
--platform android | Genera solo Android |
--no-clean cuando iteras en un parche nativo local que estás migrando en un pluginAntes de fusionar cambios de plugins, diffsea lo que prebuild produjo:
npx expo prebuild --no-install
git diff ios android # solo si las carpetas están rastreadas (brownfield)# Imprimir configuración resuelto sin escribir archivos
npx expo config --type introspect--type introspect muestra resultados de mods que aplicarían plugins - más rápido que prebuild completo durante el desarrollo de pluginsexpo-doctor detecta campos de configuración inválidos que fallan silenciosamente hasta prebuildapp.config.ts importa cuando múltiples plugins tocan el mismo archivoLos permisos nativos y derechos pertenecen en plugins, no en ediciones post-prebuild:
// app.config.ts
const config: ExpoConfig = {
// ...name, slug, ios, android
plugins: [
[
"expo-camera",
{
cameraPermission: "Allow $(PRODUCT_NAME) to scan barcodes.",
},
],
],
};npx expo install expo-camera
npx expo prebuild --platform ios --no-installexpo-camera envía un plugin de configuración que agrega NSCameraUsageDescription a Info.plistLos módulos nativos personalizados requieren un desarrollo build, no Expo Go. Prebuild genera el shell nativo:
npx expo install expo-dev-client
npx expo prebuild
npx expo run:ios// package.json scripts
{
"scripts": {
"prebuild": "expo prebuild",
"ios:native": "expo run:ios",
"android:native": "expo run:android"
}
}expo run:ios ejecuta prebuild si ios/ falta, instala pods, luego compilaPrebuild lee claves de plataforma y genera configuración nativa correspondiente:
// app.config.ts fragmento
ios: {
bundleIdentifier: "com.example.prebuildbasics",
infoPlist: {
UIBackgroundModes: ["fetch"],
},
associatedDomains: ["applinks:shop.example.com"],
},
android: {
package: "com.example.prebuildbasics",
intentFilters: [
{
action: "VIEW",
autoVerify: true,
data: [{ scheme: "https", host: "shop.example.com", pathPrefix: "/orders" }],
category: ["BROWSABLE", "DEFAULT"],
},
],
},npx expo prebuild --no-installassociatedDomains e intent filtersexpo-router, expo-notifications) sobre infoPlist sin procesar cuando estén disponiblesSDK 57 se dirige a RN 0.86 con la Nueva Arquitectura habilitada en plantillas de prebuild:
// app.config.ts
const config: ExpoConfig = {
// ...
newArchEnabled: true,
};npx expo-doctor
npx expo prebuild --no-installnewArchEnabled: false es una escotilla de emergencia temporal - documenta un ADR si la desactivasnewArchEnabled: rm -rf ios android && npx expo prebuildLos bumps de SDK eliminan carpetas nativas obsoletas bajo CNG:
npx expo install expo@^57.0.0
npx expo install --fix
npx expo-doctor
rm -rf ios android
npx expo prebuild --no-installreact-native independientemente - expo install --fix fija RN 0.86.0 para SDK 57ios//android/ están ausentes de la cargaEn un workspace de pnpm/Turborepo, ejecuta prebuild desde el directorio de paquete de la aplicación:
cd apps/mobile
npx expo prebuild --no-install// apps/mobile/app.config.ts
const config: ExpoConfig = {
name: "Mobile",
slug: "mobile",
// ...
};ios/ - solo aplicaciones implementables ejecutan prebuildImpulsa bundle IDs de staging y producción desde variables env - un archivo de configuración, múltiples binarios:
// app.config.ts
const IS_DEV = process.env.APP_VARIANT === "development";
const config: ExpoConfig = {
name: IS_DEV ? "PrebuildBasics (Dev)" : "PrebuildBasics",
slug: "prebuild-basics",
ios: {
bundleIdentifier: IS_DEV
? "com.example.prebuildbasics.dev"
: "com.example.prebuildbasics",
},
android: {
package: IS_DEV
? "com.example.prebuildbasics.dev"
: "com.example.prebuildbasics",
},
};
export default config;APP_VARIANT=development npx expo prebuild --no-install
APP_VARIANT=production npx expo prebuild --no-installenv.APP_VARIANT por build - prebuild se ejecuta con el bundle ID correcto en CIprojectId si los binarios se envían por separadoapp.config.ts - usa EAS Secrets para claves de firmaAgrega una puerta de CI que prueba que la configuración produce salida nativa reproducible:
#!/usr/bin/env bash
# scripts/verify-prebuild.sh
set -euo pipefail
npx expo-doctor
rm -rf ios android
npx expo prebuild --no-install
# Opcional: fallar si se detecta diff nativo inesperado cuando las carpetas se rastrean
if git diff --quiet ios android 2>/dev/null; then
echo "Prebuild output matches committed native projects."
else
echo "Native diff detected - migrate changes to config plugins."
exit 1
fiios/ y recrearlos.expo run:ios y expo run:android necesitan cadenas de herramientas de plataforma para compilar.--no-clean, lista de verificación de iteración localexpo run:ios/android y comprometer directorios nativosVersiones de pila: Esta página fue escrita para React 19.2.3, React Native 0.86.0 y Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última actualización: 19 jul 2026