Файл .env хранит переменные окружения в простом формате ключ-значение и отделяет конфигурацию от исходного кода приложения. По данным The Twelve-Factor App (2011), конфигурация должна строго отделяться от кода, и .env-файлы стали стандартом этого подхода. .env File позволяет подставлять разные значения API-ключей, URL сервера и флагов сборки без перекомпиляции проекта.
Главное
.env File — это конфигурационный файл, в котором хранятся переменные окружения в простом текстовом формате KEY=VALUE. Каждая строка содержит одну переменную: имя ключа и его значение, разделённые знаком равенства.
.env-файлы решают фундаментальную проблему современной разработки: разные среды (локальная, тестовая, боевая) требуют совершенно разных настроек. URL API сервера на локальной машине — http://localhost:8080, на боевом сервере — https://api.production.com. Если эти значения жёстко зашиты непосредственно в код приложения, каждый билд для другой среды требует изменения исходного кода.
Практика хранения конфигурации вне основного кода приложения стандартизирована в манифесте The Twelve-Factor App (2011), который выделил переменные окружения как единственно правильный способ настройки приложения. По данным опроса JetBrains Developer Ecosystem (2024), более 67% мобильных разработчиков используют .env-файлы в своих проектах.
Для мобильной разработки .env даёт дополнительное преимущество: значения подставляются на этапе сборки через Gradle (Android) или xcconfig (iOS), что позволяет создавать отдельные билды для разработки, стейджинга и продакшена без изменения исходного кода.
Особенно полезен .env при работе в команде: каждый разработчик создаёт свой локальный .env с настройками под свою среду (путь к локальной БД, debug-ключи API), а общие настройки фиксируются в .env.example в репозитории. Это исключает ситуацию, когда после git pull у разработчика ломается сборка из-за отсутствия переменной окружения, о которой он не знал. Новый член команды просто копирует .env.example в .env и заполняет свои локальные значения.
Формат .env максимально прост: каждая строка — одна переменная вида KEY=VALUE. Пробелы вокруг знака равенства обычно игнорируются, но в большинстве библиотек считаются частью значения, поэтому их лучше избегать.
Комментарии начинаются с символа # — вся строка после него игнорируется. Пустые строки также пропускаются. Если значение содержит пробелы, оно заключается в двойные или одинарные кавычки.
# Основные настройки окружения
APP_NAME=MyMobileApp
APP_ENV=development
# API конфигурация
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# Чувствительные данные
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
Все переменные в .env — строки, но библиотеки загрузки могут приводить их к нужному типу. Для экранирования специальных символов используются обратные слэши и кавычки. Если значение содержит символ # как часть текста, его нужно экранировать как \#.
KEY=value или KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}При загрузке .env библиотеки могут выполнять интерполяцию переменных — подставлять значения одних ключей внутрь других. Например, переменная DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db раскроет DB_USER и DB_PASS из того же файла.
Способ подключения .env зависит от платформы. Android использует плагины Gradle, iOS — конфигурационные файлы xcconfig, а кросс-платформенные решения вроде Flutter — специализированные библиотеки.
В Android .env загружается через плагин gradle-dotenv. Плагин читает .env из корня проекта и добавляет значения в BuildConfig, после чего они доступны в Kotlin или Java коде через сгенерированные поля.
// build.gradle.kts (app level)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// Доступ в коде: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
В iOS переменные окружения обычно настраиваются через xcconfig файлы. Для загрузки .env в Swift используется библиотека DotEnv или встроенный механизм Info.plist с пользовательскими ключами.
// Загрузка .env в 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"
}
}
Для Flutter существует пакет flutter_dotenv, который загружает переменные из .env во время инициализации приложения. Файл .env помещается в корень проекта, а переменные становятся доступны через класс dotenv.
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — загрузка при старте
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));
}
Все три подхода объединяет общий принцип: .env загружается на этапе сборки или при старте приложения, значения кешируются и используются в коде через сгенерированные константы. Это исключает попадание чувствительных данных в репозиторий.
Для React Native используется пакет react-native-config, который на этапе сборки автоматически генерирует класс BuildConfig для Android и константы в Info.plist для iOS из одного .env файла в корне проекта. Это особенно удобно для стартапов, которые используют Expo или bare workflow: достаточно одного .env на корневом уровне, и все платформы получают одинаковые переменные окружения без дублирования конфигураций.
Несмотря на все преимущества, .env не является полноценным решением для хранения секретов в production среде. Он даёт базовый уровень защиты, но при неправильном использовании может привести к утечке конфиденциальных данных.
Самое важное правило — .env никогда не должен попадать в систему контроля версий репозитория. Файл добавляется в .gitignore сразу после создания, а в репозиторий коммитится только файл-образец .env.example с пустыми или фиктивными значениями.
# .env.example — коммитится в репозиторий
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — не указывать даже в примере!
# JWT_SECRET — не указывать даже в примере!
# .gitignore
# Dotenv файлы
.env
.env*.local
Для боевых проектов рекомендуется использовать профессиональные решения для управления секретами. .env в production допустим только если файл расположен вне document-root сервера и имеет строгие права доступа.
По данным Snyk State of Open Source Security (2024), утечка .env-файлов через репозитории стала причиной более 12% всех инцидентов с раскрытием API-ключей среди опрошенных компаний. Использование отдельного менеджера секретов позволяет снизить этот риск до нуля.
Дополнительная защита достигается внедрением pre-commit хуков с использованием инструментов вроде husky и lint-staged, которые проверяют, не добавил ли разработчик .env в коммит случайно. Инструменты вроде git-secrets (AWS) и talisman сканируют каждый коммит на наличие паттернов API-ключей, токенов и паролей, блокируя коммит при обнаружении. Для CI-пайплайнов рекомендуется добавлять проверку detect-secrets — автоматический скринер, который не пропустит .env-файл в репозиторий даже при ошибке разработчика.
Часто задаваемые вопросы
Нет, .env не должен коммититься в Git. Файл содержит чувствительные данные и должен быть добавлен в .gitignore. Вместо него в репозиторий помещается .env.example с шаблоном всех необходимых переменных.
.env — реальный файл с боевыми значениями, который никогда не коммитится. Файл .env.example содержит те же ключи, но с пустыми или фейковыми значениями — он коммитится в репозиторий как образец для новых разработчиков.
Можно, но не рекомендуется без дополнительной защиты. Если .env используется на боевом сервере, файл должен быть расположен вне document-root веб-сервера с правами доступа 600 (только владелец). Для критических проектов предпочтительны менеджеры секретов.
Через плагин gradle-dotenv (co.uzzu.dotenv). Плагин читает .env из корня проекта и экспортирует значения в BuildConfig. Переменные становятся доступны в коде как BuildConfig.VARIABLE_NAME на этапе компиляции.
Да, многие парсеры поддерживают интерполяцию в формате ${VAR_NAME}. Например, URL=${HOST}:${PORT} подставит значения HOST и PORT из того же файла. Однако эта возможность зависит от конкретной библиотеки-загрузчика.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также