El archivo .env almacena variables de entorno en un formato simple clave-valor y separa la configuración del código fuente de la aplicación. Según The Twelve-Factor App (2011), la configuración debe separarse estrictamente del código, y los archivos .env se han convertido en el estándar de este enfoque. .env File permite inyectar diferentes valores de claves API, URL de servidores y banderas de compilación sin recompilar el proyecto.
Puntos clave
.env File es un archivo de configuración que almacena variables de entorno en un formato de texto simple KEY=VALUE. Cada línea contiene una variable: el nombre de la clave y su valor, separados por un signo igual.
Los archivos .env resuelven un problema fundamental del desarrollo moderno: diferentes entornos (local, pruebas, producción) requieren configuraciones completamente distintas. La URL del servidor API en una máquina local es http://localhost:8080, en un servidor de producción es https://api.production.com. Si estos valores están codificados directamente en el código de la aplicación, cada compilación para un entorno diferente requiere cambiar el código fuente.
La práctica de almacenar la configuración fuera del código principal de la aplicación fue estandarizada en el manifiesto The Twelve-Factor App (2011), que identificó las variables de entorno como la única forma correcta de configurar una aplicación. Según la encuesta JetBrains Developer Ecosystem (2024), más del 67% de los desarrolladores móviles usan archivos .env en sus proyectos.
Para el desarrollo móvil, .env brinda una ventaja adicional: los valores se sustituyen en la etapa de compilación a través de Gradle (Android) o xcconfig (iOS), lo que permite crear compilaciones separadas para desarrollo, staging y producción sin cambiar el código fuente.
.env es especialmente útil al trabajar en equipo: cada desarrollador crea su propio .env local con configuraciones para su entorno (ruta a la BD local, claves API de depuración), mientras que las configuraciones comunes se fijan en .env.example en el repositorio. Esto elimina la situación en la que después de un git pull la compilación de un desarrollador se rompe por falta de una variable de entorno que desconocía. Un nuevo miembro del equipo simplemente copia .env.example a .env y completa sus valores locales.
El formato .env es extremadamente simple: cada línea es una variable con la forma KEY=VALUE. Los espacios alrededor del signo igual generalmente se ignoran, pero en la mayoría de las bibliotecas se consideran parte del valor, por lo que es mejor evitarlos.
Los comentarios comienzan con el carácter # — toda la línea después de él se ignora. Las líneas vacías también se omiten. Si el valor contiene espacios, se encierra entre comillas dobles o simples.
# Configuraciones básicas del entorno
APP_NAME=MyMobileApp
APP_ENV=development
# Configuración de API
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# Datos sensibles
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
Todas las variables en .env son cadenas, pero las bibliotecas cargadoras pueden convertirlas al tipo necesario. Para escapar caracteres especiales se usan barras invertidas y comillas. Si un valor contiene el carácter # como parte del texto, debe escaparse como \#.
KEY=value o KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}Al cargar .env, las bibliotecas pueden realizar interpolación de variables — sustituir los valores de unas claves dentro de otras. Por ejemplo, la variable DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db expandirá DB_USER y DB_PASS del mismo archivo.
La forma de conectar .env depende de la plataforma. Android usa plugins de Gradle, iOS — archivos de configuración xcconfig, y las soluciones multiplataforma como Flutter — bibliotecas especializadas.
En Android, .env se carga a través del plugin gradle-dotenv. El plugin lee .env de la raíz del proyecto y agrega los valores a BuildConfig, después de lo cual están disponibles en el código Kotlin o Java a través de campos generados.
// build.gradle.kts (app level)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// Acceso en código: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
En iOS, las variables de entorno generalmente se configuran a través de archivos xcconfig. Para cargar .env en Swift se usa la biblioteca DotEnv o el mecanismo integrado Info.plist con claves personalizadas.
// Carga de .env en proyecto Swift
import DotEnv
struct AppConfig {
static func load() {
let env = DotEnv(Bundle.main)
env.load()
let apiURL = ProcessInfo.processInfo
.environment["API_BASE_URL"] ??
"https://default.api.com"
}
}
Para Flutter existe el paquete flutter_dotenv, que carga las variables de .env durante la inicialización de la aplicación. El archivo .env se coloca en la raíz del proyecto y las variables están disponibles a través de la clase dotenv.
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — carga al inicio
import 'package:flutter_dotenv/flutter_dotenv.dart';
void main() async {
await dotenv.load(fileName: '.env');
var apiUrl = dotenv.get('API_BASE_URL');
runApp(MyApp(baseUrl: apiUrl));
}
Los tres enfoques comparten un principio común: .env se carga en la etapa de compilación o al iniciar la aplicación, los valores se almacenan en caché y se usan en el código a través de constantes generadas. Esto evita que los datos sensibles lleguen al repositorio.
Para React Native se usa el paquete react-native-config, que en la etapa de compilación genera automáticamente una clase BuildConfig para Android y constantes en Info.plist para iOS a partir de un solo archivo .env en la raíz del proyecto. Esto es especialmente conveniente para startups que usan Expo o bare workflow: basta con un solo .env en el nivel raíz para que todas las plataformas reciban las mismas variables de entorno sin duplicar configuraciones.
A pesar de todas las ventajas, .env no es una solución completa para almacenar secretos en un entorno de producción. Proporciona un nivel básico de protección, pero si se usa incorrectamente, puede provocar fuga de datos confidenciales.
La regla más importante — .env nunca debe terminar en el sistema de control de versiones del repositorio. El archivo se agrega a .gitignore inmediatamente después de su creación, y solo se confirma en el repositorio el archivo de muestra .env.example con valores vacíos o ficticios.
# .env.example — se confirma en el repositorio
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — ¡no especificar ni en el ejemplo!
# JWT_SECRET — ¡no especificar ni en el ejemplo!
# .gitignore
# Archivos Dotenv
.env
.env*.local
Para proyectos en producción, se recomienda usar soluciones profesionales de gestión de secretos. .env en producción solo es aceptable si el archivo está ubicado fuera del document-root del servidor y tiene permisos de acceso estrictos.
Según Snyk State of Open Source Security (2024), la filtración de archivos .env a través de repositorios fue la causa de más del 12% de todos los incidentes de divulgación de claves API entre las empresas encuestadas. El uso de un gestor de secretos dedicado reduce este riesgo a cero.
Se logra protección adicional mediante la implementación de hooks de pre-commit usando herramientas como husky y lint-staged, que verifican si el desarrollador agregó accidentalmente .env a un commit. Herramientas como git-secrets (AWS) y talisman escanean cada commit en busca de patrones de claves API, tokens y contraseñas, bloqueando el commit si se detectan. Para pipelines de CI, se recomienda agregar detect-secrets — un escáner automático que no permitirá que un archivo .env llegue al repositorio incluso si el desarrollador comete un error.
Preguntas frecuentes
No, .env no debe confirmarse en Git. El archivo contiene datos sensibles y debe agregarse a .gitignore. En su lugar, se coloca en el repositorio .env.example con una plantilla de todas las variables necesarias.
.env es el archivo real con valores de producción que nunca se confirma. El archivo .env.example contiene las mismas claves pero con valores vacíos o falsos — se confirma en el repositorio como muestra para los nuevos desarrolladores.
Sí, pero no se recomienda sin protección adicional. Si .env se usa en un servidor de producción, el archivo debe ubicarse fuera del document-root del servidor web con permisos de acceso 600 (solo propietario). Para proyectos críticos, son preferibles los gestores de secretos.
A través del plugin gradle-dotenv (co.uzzu.dotenv). El plugin lee .env de la raíz del proyecto y exporta los valores a BuildConfig. Las variables están disponibles en el código como BuildConfig.VARIABLE_NAME en la etapa de compilación.
Sí, muchos analizadores admiten interpolación en el formato ${VAR_NAME}. Por ejemplo, URL=${HOST}:${PORT} sustituirá los valores de HOST y PORT del mismo archivo. Sin embargo, esta capacidad depende de la biblioteca cargadora específica.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también