Separa la configuración de desarrollo, staging y producción sin confirmar secretos, usando archivos .env locales para desarrollo y variables de entorno de EAS para compilaciones en la nube, actualizaciones y flujos de trabajo.
Tarjeta de referencia rápida - lista para copiar y pegar.
// eas.json - conecta cada perfil de compilación a un entorno de EAS{ "build": { "development": { "developmentClient": true, "distribution": "internal", "environment": "development" }, "preview": { "distribution": "internal", "environment": "preview" }, "production": { "distribution": "store", "environment": "production" } }}
# Crear variables en la nube (repite por entorno)eas env:create --name EXPO_PUBLIC_API_URL \ --value https://api.staging.example.com \ --environment preview \ --visibility plaintext# Extrae variables de preview localmente (escribe .env.local - mantenlo ignorado por git)eas env:pull --environment preview# Publica una actualización de OTA usando el mismo entorno que la compilacióneas update --environment production --message "Hotfix auth redirect"
// src/config.ts - solo las variables EXPO_PUBLIC_ se insertan en el bundleexport const config = { apiUrl: process.env.EXPO_PUBLIC_API_URL ?? "http://localhost:3000", appEnv: process.env.EXPO_PUBLIC_APP_ENV ?? "development",} as const;
Cuándo usarlo:
Envías múltiples variantes de aplicación (cliente de dev, QA interno, App Store) que necesitan diferentes puntos finales de API o identificadores de paquete.
Tu equipo ejecuta EAS Build o EAS Update y no puede confiar en archivos .env locales sin confirmar en ejecutores remotos.
Necesitas visibilidad basada en roles - texto plano para configuración pública, sensible para registros ofuscados, secreto para tokens NPM y claves de firma.
Deseas una única fuente de verdad para que una compilación de preview y una actualización de OTA de preview resuelvan los mismos valores EXPO_PUBLIC_*.
Desarrollo local: Expo CLI carga .env, .env.local y otros archivos dotenv estándar. Las variables con prefijo EXPO_PUBLIC_ se reemplazan estáticamente en tu fuente durante la compilación.
EAS Build: Cuando se establece environment en un perfil de compilación, EAS inyecta las variables de ese entorno en el worker de compilación. Las variables de texto plano y sensibles están disponibles al resolver app.config.ts; las variables secretas están disponibles solo en el servidor durante el job.
EAS Update (SDK 55+):eas update --environment <name> es obligatorio. Solo se utilizan variables de ese entorno de EAS - los archivos .env locales se ignoran, manteniendo bundles de OTA alineados con compilaciones de tienda.
Alcance: Las variables pueden ser amplias a nivel de proyecto (una aplicación) o amplias a nivel de cuenta (compartidas entre aplicaciones en una organización).
Cliente de dev, API local, herramientas de depuración
developmentClient: true
preview
QA interno, API de staging, TestFlight/Play interno
Todo lo demás (fallback predeterminado)
production
Versiones de App Store / Play Store
distribution: "store"
Se recomiendan campos environment explícitos - la detección automática es conveniente pero fácil de mal configurar cuando los perfiles comparten banderas similares.
Nunca - solo herramientas en tiempo de compilación
Cualquier cosa insertada en JavaScript del cliente es extraíble del código de aplicación compilada. Usa secretos para NPM_TOKEN, SENTRY_AUTH_TOKEN y valores similares en tiempo de compilación - no para claves API "privadas" enviadas a usuarios.
Poner secretos de API en EXPO_PUBLIC_* - Cualquier valor insertado en JavaScript es visible en el binario de la aplicación. Solución: Mantén secretos del lado del servidor; usa tokens de corta duración de tu backend.
Omitir --environment en eas update (SDK 55+) - Las actualizaciones pueden no coincidir con las variables utilizadas en tu compilación de producción. Solución: Siempre pasa --environment que coincida con el perfil de compilación de destino.
Usar NODE_ENV para cambiar archivos .env - npx expo export fuerza NODE_ENV=production, por lo que los archivos de prueba/staging no se cargarán como se esperaba. Solución: Usa eas env:pull --environment <name> o EXPO_PUBLIC_APP_ENV explícito.
Notación de corchetes para variables de entorno - process.env['EXPO_PUBLIC_KEY'] no es analizable estáticamente y no se insertará. Solución: Usa notación de punto: process.env.EXPO_PUBLIC_KEY.
Asumir que los secretos están disponibles en app.config.ts localmente - Las variables de tipo secreto no se pueden leer fuera de servidores de EAS. Solución: Usa sensible/texto plano para valores necesarios durante la resolución de configuración local, o proporciona valores predeterminados de dev.
Confirmar .env.local después de eas env:pull - Los archivos extraídos suelen contener valores de staging/producción. Solución: Añade .env*.local a .gitignore y usa comandos de extracción separados por máquina de desarrollador.
Entornos no coincidentes entre jobs de flujo de trabajo - Un job de huella digital en production emparejado con una compilación de preview causa secretos incorrectos. Solución: Establece jobs.<id>.environment para coincidir con el entorno del perfil de compilación en flujos de trabajo de EAS.
¿Cuáles son los tres entornos de EAS predeterminados?
development, preview, and production. Cada uno es un conjunto independiente de variables. Los nombres de entorno personalizados están disponibles en planes Enterprise y Production de EAS.
¿Cómo conecto un perfil de compilación de eas.json a un entorno?
Todas las variables asignadas a ese entorno se inyectan durante la compilación.
¿Cuál es la diferencia entre variables amplias a nivel de proyecto y de cuenta?
Nivel de proyecto: Limitadas a un proyecto de EAS (una aplicación). Gestionadas en configuración de proyecto.
Nivel de cuenta: Disponibles para todos los proyectos bajo una cuenta de Expo u organización. Útiles para tokens de herramientas compartidas.
¿Qué variables son seguras para usar en JavaScript del cliente?
Solo variables con prefijo EXPO_PUBLIC_. Se insertan en el bundle en tiempo de compilación y son extraíbles del código de aplicación compilada. Nunca prefijes claves privadas o tokens de administrador con EXPO_PUBLIC_.
¿Cómo cargo variables de EAS para desarrollo local?
eas env:pull --environment development
Esto escribe un archivo .env.local. Reinicia Metro o recarga la aplicación para recoger cambios. Mantén .env.local ignorado por git.
¿Por qué se requiere --environment para eas update en SDK 55+?
Para garantizar que los bundles de OTA utilicen las mismas variables de entorno de EAS que las compilaciones en la nube - no cualquier archivo .env que exista en la máquina que ejecuta el comando de actualización.
Gotcha: ¿Por qué process.env["EXPO_PUBLIC_API_URL"] no funciona?
La configuración de Metro de Expo solo inserta notación de punto estático (process.env.EXPO_PUBLIC_API_URL). El acceso por corchetes y la destructuración no son compatibles. Usa notación de punto en todas partes.
¿Para qué sirven las variables de tipo secreto?
Valores en tiempo de compilación como NPM_TOKEN o credenciales de registro privadas. No se pueden leer fuera de servidores de EAS y no están disponibles durante la evaluación local de app.config.ts. Lo hacen no proteger valores que insertas en código de cliente.
¿Cómo elige EAS un entorno si omito el campo environment?
Automáticamente: production cuando distribution es store, development cuando developmentClient es true, y preview para todo lo demás. La configuración explícita es más segura para equipos con muchos perfiles.
¿Puedo usar variables de entorno en flujos de trabajo de EAS?
Sí. Los jobs de compilación heredan environment del perfil eas.json correspondiente. Otros tipos de jobs (actualización, huella digital, Maestro) aceptan jobs.<id>.environment. Mantén entornos consistentes entre jobs en el mismo flujo de trabajo.
¿Cómo funcionan las variables de entorno de tipo archivo?
Carga un archivo (por ejemplo google-services.json) como variable de entorno. EAS lo expone como ruta de archivo en el runner de compilación. Útil para credenciales que deben existir como archivos durante la compilación nativa.
¿Debo confirmar .env en git?
Confirma un .env con valores predeterminados seguros o valores de marcador de posición EXPO_PUBLIC_* si es útil para la incorporación. Nunca confirmes .env.local o archivos que contengan secretos reales. Usa EAS para valores de producción.
¿Cómo ejecuto un comando único con variables de entorno de EAS?
eas env:exec --environment production 'npx sentry-expo-upload-sourcemaps dist'
eas env:exec carga el entorno antes de ejecutar el comando de shell.
¿Cómo lee app.config.ts variables de entorno durante EAS Build?
Node evalúa app.config.ts en el worker de compilación. Las variables de EAS de texto plano y sensible están disponibles como process.env.*. Úsalas para establecer bundleIdentifier, name, plugins, y campos extra por entorno.
¿Cuál es la relación entre EXPO_PUBLIC_APP_ENV y entornos de EAS?
Son conceptos independientes que alineas por convención. EXPO_PUBLIC_APP_ENV es una variable que defines. EAS development/preview/production son contenedores para variables. Establece EXPO_PUBLIC_APP_ENV=preview dentro del entorno de EAS de preview para consistencia.