Файл .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 хукiв з використанням інструментів на кшталт 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також