.env faylı ətraf dəyişənlərini sadə açar-dəyər formatında saxlayır və konfiqurasiyanı tətbiqin mənbə kodundan ayırır. The Twelve-Factor App (2011) məlumatlarına görə, konfiqurasiya koddan ciddi şəkildə ayrılmalıdır və .env faylları bu yanaşmanın standartına çevrilmişdir. .env File layihəni yenidən kompilyasiya etmədən API açarları, server URL və kompilyasiya bayraqlarının müxtəlif dəyərlərini əvəz etməyə imkan verir.
Əsas məqamlar
.env File ətraf dəyişənlərinin sadə KEY=VALUE mətn formatında saxlandığı konfiqurasiya faylıdır. Hər sətir bir dəyişəni ehtiva edir: açar adı və onun dəyəri bərabər işarəsi ilə ayrılır.
.env faylları müasir inkişafın fundamental problemini həll edir: müxtəlif mühitlər (lokal, test, istehsal) tamamilə fərqli parametrlər tələb edir. Lokal maşındakı API server URL-i http://localhost:8080, istehsal serverində — https://api.production.com. Əgər bu dəyərlər birbaşa tətbiq koduna yazılıbsa, hər fərqli mühit üçün hər kompilyasiya mənbə kodunun dəyişdirilməsini tələb edir.
Konfiqurasiyanın tətbiqin əsas kodundan kənarda saxlanması təcrübəsi The Twelve-Factor App (2011) manifestində standartlaşdırılmışdır və ətraf dəyişənlərini tətbiqi konfiqurasiya etməyin yeganə düzgün yolu kimi göstərmişdir. JetBrains Developer Ecosystem (2024) sorğusuna görə, mobil tərtibatçıların 67%-dən çoxu layihələrində .env fayllarından istifadə edir.
Mobil inkişaf üçün .env əlavə üstünlük verir: dəyərlər Gradle (Android) və ya xcconfig (iOS) vasitəsilə kompilyasiya mərhələsində əvəz olunur ki, bu da mənbə kodunu dəyişdirmədən inkişaf, stecinq və istehsal üçün ayrıca kompilyasiyalar yaratmağa imkan verir.
.env xüsusilə komanda işində faydalıdır: hər bir tərtibatçı öz mühiti üçün lokal .env yaradır (lokal DB yolu, debug API açarları), ümumi parametrlər isə depoda .env.example-da saxlanılır. Bu, git pull-dan sonra tərtibatçının bilmədiyi ətraf dəyişəni çatışmazlığı səbəbindən kompilyasiyanın sınması vəziyyətini aradan qaldırır. Yeni komanda üzvü sadəcə .env.example-ı .env-ə kopyalayır və öz lokal dəyərlərini doldurur.
.env formatı maksimum dərəcədə sadədir: hər sətir KEY=VALUE şəklində bir dəyişəndir. Bərabər işarəsi ətrafındakı boşluqlar adətən nəzərə alınmır, lakin əksər kitabxanalarda dəyərin bir hissəsi hesab olunur, ona görə də onlardan qaçmaq daha yaxşıdır.
Şərhlər # simvolu ilə başlayır — ondan sonra bütün sətir nəzərə alınmır. Boş sətirlər də keçilir. Əgər dəyər boşluqlar ehtiva edirsə, qoşa və ya tək dırnaq işarələrinə alınır.
# Əsas mühit parametrləri
APP_NAME=MyMobileApp
APP_ENV=development
# API konfiqurasiyası
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# Həssas məlumatlar
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
.env-də bütün dəyişənlər sətirlərdir, lakin yükləmə kitabxanaları onları lazımi tipə çevirə bilər. Xüsusi simvolları ekranlaşdırmaq üçün tərs kəsiklər və dırnaq işarələri istifadə olunur. Əgər dəyər mətnin bir hissəsi kimi # simvolu ehtiva edirsə, onu \# kimi ekranlaşdırmaq lazımdır.
KEY=value və ya KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}.env yüklənərkən kitabxanalar dəyişən interpolasiyasını həyata keçirə bilər — bir açarların dəyərlərini digərlərinin içərisinə əvəz edə bilər. Məsələn, DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db dəyişəni eyni fayldan DB_USER və DB_PASS dəyərlərini açacaqdır.
.env-i qoşmaq üsulu platformadan asılıdır. Android Gradle plaginlərindən, iOS — xcconfig konfiqurasiya fayllarından, Flutter kimi çarpaz-platforma həlləri isə ixtisaslaşmış kitabxanalardan istifadə edir.
Android-də .env gradle-dotenv plaquini vasitəsilə yüklənir. Plagin .env-i layihənin kökündən oxuyur və dəyərləri BuildConfig-ə əlavə edir, bundan sonra onlar Kotlin və ya Java kodunda yaradılmış sahələr vasitəsilə əlçatan olur.
// build.gradle.kts (app level)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// Kodda giriş: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
iOS-da ətraf dəyişənləri adətən xcconfig faylları vasitəsilə konfiqurasiya olunur. .env-i Swift-də yükləmək üçün DotEnv kitabxanası və ya xüsusi açarlarla Info.plist-in daxili mexanizmi istifadə olunur.
// Swift layihəsində .env-in yüklənməsi
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 üçün tətbiqin işə salınması zamanı .env-dən dəyişənləri yükləyən flutter_dotenv paketi mövcuddur. .env faylı layihənin kökünə yerləşdirilir və dəyişənlər dotenv sinfi vasitəsilə əlçatan olur.
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — başlanğıcda yükləmə
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));
}
Hər üç yanaşma ümumi prinsipi birləşdirir: .env kompilyasiya mərhələsində və ya tətbiqin startında yüklənir, dəyərlər keşlənir və yaradılmış sabitlər vasitəsilə kodda istifadə olunur. Bu, həssas məlumatların depoya daxil olmasının qarşısını alır.
React Native üçün react-native-config paketi istifadə olunur ki, o da kompilyasiya mərhələsində bir .env faylından Android üçün BuildConfig sinfi və iOS üçün Info.plist-də sabitlər avtomatik yaradır. Bu, Expo və ya bare workflow istifadə edən startaplar üçün xüsusilə əlverişlidir: kök səviyyəsində bir .env kifayətdir və bütün platformalar eyni ətraf dəyişənlərini alır.
Bütün üstünlüklərə baxmayaraq, .env istehsal mühitində sirlərin saxlanması üçün tam hüquqlu həll deyil. O, əsas qoruma səviyyəsini təmin edir, lakin düzgün istifadə olunmadıqda məxfi məlumatların sızmasına səbəb ola bilər.
Ən vacib qayda — .env heç vaxt versiya nəzarət sisteminə daxil olmamalıdır. Fayl yaradıldıqdan dərhal sonra .gitignore-a əlavə olunur, depoya isə yalnız boş və ya uydurma dəyərləri olan nümunə faylı .env.example göndərilir.
# .env.example — depoya committ edilir
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — nümunədə belə göstərilmir!
# JWT_SECRET — nümunədə belə göstərilmir!
# .gitignore
# Dotenv faylları
.env
.env*.local
İstehsal layihələri üçün sirlərin idarə olunması üçün peşəkar həllərdən istifadə etmək tövsiyə olunur. .env istehsalda yalnız fayl serverin document-root-dan kənarda yerləşərsə və ciddi giriş hüquqlarına malik olarsa icazəlidir.
Snyk State of Open Source Security (2024) məlumatlarına görə, .env fayllarının depo vasitəsilə sızması sorğuda iştirak edən şirkətlər arasında API açarlarının açıqlanması ilə bağlı bütün hadisələrin 12%-dən çoxunun səbəbi olmuşdur. Ayrıca sirlər menecerinin istifadəsi bu riski sıfıra endirməyə imkan verir.
Əlavə qorunma pre-commit hook larının tətbiqi ilə əldə olunur — husky və lint-staged kimi alətlər tərtibatçının təsadüfən .env-i committə əlavə edib-etmədiyini yoxlayır. git-secrets (AWS) və talisman kimi alətlər hər committi API açarı, token və şifrə nümunələrinə görə skan edir, aşkarlandıqda committi bloklayır. CI boru kəmərləri üçün detect-secrets yoxlamasını əlavə etmək tövsiyə olunur — tərtibatçının səhvi halında belə .env faylının depoya düşməsinə imkan verməyən avtomatik skaner.
Tez-tez verilən suallar
Xeyr, .env Git-ə committ edilməməlidir. Fayl həssas məlumatlar ehtiva edir və .gitignore-a əlavə olunmalıdır. Onun əvəzinə depoya bütün lazımi dəyişənlərin şablonu olan .env.example yerləşdirilir.
.env — heç vaxt committ edilməyən real dəyərləri olan fayldır. .env.example faylı eyni açarları ehtiva edir, lakin boş və ya uydurma dəyərlərlə — yeni tərtibatçılar üçün nümunə kimi depoya committ edilir.
Bəli, lakin əlavə qoruma olmadan tövsiyə edilmir. Əgər .env istehsal serverində istifadə olunursa, fayl serverin document-root-dan kənarda yerləşməli və 600 giriş hüququna (yalnız sahib) malik olmalıdır. Kritik layihələr üçün sirlər menecerləri daha üstündür.
gradle-dotenv (co.uzzu.dotenv) plaquini vasitəsilə. Plagin .env-i layihənin kökündən oxuyur və dəyərləri BuildConfig-ə ixrac edir. Dəyişənlər kompilyasiya mərhələsində kodda BuildConfig.VARIABLE_NAME kimi əlçatan olur.
Bəli, bir çox parser ${VAR_NAME} formatında interpolasiyanı dəstəkləyir. Məsələn, URL=${HOST}:${PORT} eyni fayldan HOST və PORT dəyərlərini əvəz edəcək. Lakin bu funksionallıq konkret yükləmə kitabxanasından asılıdır.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun