Crear o Clonar un Proyecto
Empezar un proyecto nuevo
pnpm create expo-app my-app # o: npx create-expo-app@latest my-app
cd my-app && pnpm install
Esto te da una app de Expo moderna (estilo SDK 54 / RN 0.81) con TypeScript y ruteo basado en archivos, lista para usar.
Sumarte a un proyecto existente
git clone <repo-url>
cd <repo>
pnpm install
Una nota sobre las carpetas nativas
Nota
El default del equipo es el workflow managed con Continuous Native
Generation (CNG): las carpetas ios/ y android/ nunca se commitean. Se
generan a demanda — local con npx expo prebuild, o de forma transparente en
EAS Build — a partir de app.config.ts y los paquetes instalados. Ver
Primeros Pasos → Workflow Managed (CNG) para la justificación completa y
qué hacer cuando un SDK nativo necesita más que un config plugin.
Higiene de Git: tu .gitignore
create-expo-app incluye un .gitignore sólido para el workflow managed
— el default de esta guía de abajo lo extiende ignorando /ios y /android
directamente, no solo sus subcarpetas de build. Si un proyecto se desvía de
ese default y commitea las carpetas nativas igual, también hereda sus
artefactos de build, que son fáciles de pasar por alto e inflan cada clon
con cientos de MB de artefactos compilados.
Advertencia
Los builds no van en el repo. Las apps compiladas (*.apk, *.aab,
*.ipa) y los caches de dependencias (node_modules/) son todos generados
— se regeneran desde el código en cada build. Commitearlos infla el historial
de forma irreversible.
Asegurate de que tu .gitignore cubra al menos lo siguiente:
# Dependencias
node_modules/
# Expo
.expo/
dist/
web-build/
expo-env.d.ts
# Carpetas nativas — generadas por CNG, nunca commitear (ver Workflow Managed)
/ios
/android
# Binarios de app compilados — generados en cada build
*.apk
*.aab
*.ipa
*.app
*.dSYM
*.dSYM.zip
# Metro / bundler
.metro-health-check*
*.jsbundle
# Material de firma y secretos — nunca commitear
*.p8
*.p12
*.key
*.mobileprovision
.env
.env.*
!.env.example
# Logs y salida de debug
npm-debug.*
yarn-debug.*
yarn-error.*
*.log
# TypeScript
*.tsbuildinfo
# Ruido de IDE / SO
.DS_Store
.vscode/
.idea/
*.pem
Algunas notas sobre las entradas que suelen confundir:
- No hay debug keystore de Android para commitear. Con el default managed,
android/no se commitea en absoluto, así que no hay undebug.keystorecompartido al que hacerle una excepción. Cada máquina (y EAS) usa su propia firma de debug; si una feature realmente necesita un SHA-1 de debug compartido (ej. Google Sign-In), manejalo como credencial de EAS, no como archivo commiteado. Tu keystore de release siempre es un secreto, cualquiera sea el workflow: mantenelo fuera del repo (guardalo en EAS o en un gestor de secretos). - Los archivos
.env.*(.env.dev,.env.preview,.env.prod) se ignoran;.env.examplese commitea. Mirá Variables de Entorno y Entorno y Configuración → Secretos para la regla completa — y rotá cualquier cosa que se filtre en el historial de git. - Config de Firebase (
google-services.json,GoogleService-Info.plist): con el default managed no pueden vivir dentro deios//android/(no se commitean), así que apuntalas desde afuera — ej. una ruta en la raíz referenciada víagoogleServicesFileenapp.config.ts, que un config plugin copia al proyecto generado en elprebuild. Si ese archivo en sí es seguro de commitear (normalmente es un identificador no secreto por proyecto) es una decisión que se toma una vez por proyecto y se documenta en elREADMEdel repo.
Nota
Si ios/, android/, o un artefacto de build ya está trackeado, agregarlo
al .gitignore no lo elimina — Git solo ignora cambios de archivos no
trackeados. Dejá de trackearlo con git rm -r --cached ios android (ajustá
las rutas para una limpieza más acotada) y después commiteá.
Siguiente: configurá tus Variables de Entorno.