.env dosyası, ortam değişkenlerini basit bir anahtar-değer biçiminde depolar ve yapılandırmayı uygulamanın kaynak kodundan ayırır. The Twelve-Factor App (2011)'e göre, yapılandırma koddan kesin olarak ayrılmalıdır ve .env dosyaları bu yaklaşımın standardı haline gelmiştir. .env File, projeyi yeniden derlemeden API anahtarları, sunucu URL'leri ve derleme bayraklarının farklı değerlerini yerleştirmeye olanak tanır.
Ana Noktalar
.env File, ortam değişkenlerini basit bir metin biçimi olan KEY=VALUE'da depolayan bir yapılandırma dosyasıdır. Her satır bir değişken içerir: anahtar adı ve değeri, eşittir işaretiyle ayrılmış.
.env dosyaları modern geliştirmenin temel bir sorununu çözer: farklı ortamlar (yerel, test, üretim) tamamen farklı ayarlar gerektirir. Yerel bir makinede API sunucu URL'si http://localhost:8080 iken, üretim sunucusunda https://api.production.com'dur. Bu değerler doğrudan uygulama koduna sabit kodlanmışsa, farklı bir ortam için her derleme kaynak kodunun değiştirilmesini gerektirir.
Yapılandırmayı ana uygulama kodunun dışında saklama uygulaması, The Twelve-Factor App manifestosunda (2011) standartlaştırılmış ve ortam değişkenlerini bir uygulamayı yapılandırmanın tek doğru yolu olarak belirlemiştir. JetBrains Developer Ecosystem anketine (2024) göre, mobil geliştiricilerin %67'sinden fazlası projelerinde .env dosyaları kullanmaktadır.
Mobil geliştirme için .env ek bir avantaj sağlar: değerler derleme aşamasında Gradle (Android) veya xcconfig (iOS) aracılığıyla değiştirilir, böylece kaynak kodunu değiştirmeden geliştirme, hazırlık ve üretim için ayrı derlemeler oluşturulabilir.
.env özellikle ekip halinde çalışırken kullanışlıdır: her geliştirici kendi ortamına göre ayarlarla (yerel DB yolu, hata ayıklama API anahtarları) kendi yerel .env'sini oluştururken, ortak ayarlar depoda .env.example olarak sabitlenir. Bu, git pull'dan sonra bir geliştiricinin derlemesinin bilmediği bir ortam değişkeninin eksikliği nedeniyle bozulduğu durumu ortadan kaldırır. Yeni bir ekip üyesi .env.example'ı .env'ye kopyalar ve kendi yerel değerlerini doldurur.
.env biçimi son derece basittir: her satır KEY=VALUE biçiminde bir değişkendir. Eşittir işareti etrafındaki boşluklar genellikle yok sayılır, ancak çoğu kütüphanede değerin bir parçası olarak kabul edilir, bu nedenle bunlardan kaçınmak daha iyidir.
Yorumlar # karakteriyle başlar — ondan sonraki tüm satır yok sayılır. Boş satırlar da atlanır. Değer boşluk içeriyorsa, çift veya tek tırnak içine alınır.
# Temel ortam ayarları
APP_NAME=MyMobileApp
APP_ENV=development
# API yapılandırması
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# Hassas veriler
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
.env'deki tüm değişkenler dizelerdir, ancak yükleyici kütüphaneler bunları gerekli türe dönüştürebilir. Özel karakterleri kaçış için ters eğik çizgi ve tırnak işaretleri kullanılır. Bir değer metnin parçası olarak # karakterini içeriyorsa, \# olarak kaçış yapılmalıdır.
KEY=value veya KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}.env yüklenirken, kütüphaneler değişken enterpolasyonu gerçekleştirebilir — bir anahtarın değerini diğerinin içine yerleştirebilir. Örneğin, DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db değişkeni aynı dosyadaki DB_USER ve DB_PASS'ı genişletecektir.
.env'yi bağlama yöntemi platforma bağlıdır. Android Gradle eklentilerini, iOS — xcconfig yapılandırma dosyalarını ve Flutter gibi çapraz platform çözümleri — özelleşmiş kütüphaneleri kullanır.
Android'de .env, gradle-dotenv eklentisi aracılığıyla yüklenir. Eklenti, proje kökünden .env'yi okur ve değerleri BuildConfig'e ekler, ardından oluşturulan alanlar aracılığıyla Kotlin veya Java kodunda kullanılabilir hale gelir.
// build.gradle.kts (uygulama seviyesi)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// Kodda erişim: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
iOS'te ortam değişkenleri genellikle xcconfig dosyaları aracılığıyla yapılandırılır. Swift'te .env'yi yüklemek için DotEnv kütüphanesi veya özel anahtarlarla yerleşik Info.plist mekanizması kullanılır.
// Swift projesinde .env yükleniyor
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 için flutter_dotenv paketi bulunur ve uygulama başlatılırken .env'den değişkenleri yükler. .env dosyası proje köküne yerleştirilir ve değişkenler dotenv sınıfı aracılığıyla kullanılabilir hale gelir.
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — başlangıçta yükleniyor
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));
}
Her üç yaklaşım da ortak bir prensibi paylaşır: .env derleme aşamasında veya uygulama başlatıldığında yüklenir, değerler önbelleğe alınır ve oluşturulan sabitler aracılığıyla kodda kullanılır. Bu, hassas verilerin depoya ulaşmasını engeller.
React Native için react-native-config paketi kullanılır ve derleme aşamasında proje kökündeki tek bir .env dosyasından Android için BuildConfig sınıfını ve iOS için Info.plist'te sabitleri otomatik olarak oluşturur. Bu, Expo veya bare workflow kullanan startuplar için özellikle uygundur: kök seviyesinde tek bir .env, tüm platformların yapılandırmaları çoğaltmadan aynı ortam değişkenlerini alması için yeterlidir.
Tüm avantajlara rağmen, .env üretim ortamında sırları depolamak için tam teşekküllü bir çözüm değildir. Temel bir koruma seviyesi sağlar, ancak yanlış kullanıldığında gizli verilerin sızmasına yol açabilir.
En önemli kural — .env asla deponun sürüm kontrol sistemine girmemelidir. Dosya oluşturulduktan hemen sonra .gitignore'a eklenir ve depoya yalnızca boş veya sahte değerlere sahip örnek dosya .env.example eklenir.
# .env.example — depoya commit edildi
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — örnekte bile belirtmeyin!
# JWT_SECRET — örnekte bile belirtmeyin!
# .gitignore
# Dotenv dosyaları
.env
.env*.local
Üretim projeleri için profesyonel sır yönetimi çözümlerinin kullanılması önerilir. Üretimde .env yalnızca dosya sunucunun document-root'u dışında bulunuyorsa ve katı erişim izinlerine sahipse kabul edilebilir.
Snyk State of Open Source Security (2024)'e göre, depolar aracılığıyla .env dosyası sızıntıları, ankete katılan şirketler arasındaki tüm API anahtarı ifşa olaylarının %12'sinden fazlasının nedeni olmuştur. Özel bir sır yöneticisi kullanmak bu riski sıfıra indirir.
Ön-commit kancaları uygulanarak ek koruma sağlanır; husky ve lint-staged gibi araçlar kullanılarak geliştiricinin yanlışlıkla .env'yi bir commit'e ekleyip eklemediği kontrol edilir. git-secrets (AWS) ve talisman gibi araçlar her commit'i API anahtarı, token ve şifre kalıpları için tarar, tespit edilirse commit'i engeller. CI hatları için, geliştirici hata yapsa bile .env dosyasının depoya girmesine izin vermeyecek otomatik bir tarayıcı olan detect-secrets eklenmesi önerilir.
Sıkça Sorulan Sorular
Hayır, .env Git'e commit edilmemelidir. Dosya hassas veriler içerir ve .gitignore'a eklenmelidir. Bunun yerine, depoya gerekli tüm değişkenlerin şablonuyla .env.example konulur.
.env, üretim değerlerine sahip gerçek dosyadır ve asla commit edilmez. .env.example dosyası aynı anahtarları içerir ancak boş veya sahte değerlerle — yeni geliştiriciler için örnek olarak depoya commit edilir.
Evet, ancak ek koruma olmadan önerilmez. .env üretim sunucusunda kullanılıyorsa, dosya web sunucusunun document-root'u dışında 600 (yalnızca sahip) erişim izinleriyle bulunmalıdır. Kritik projeler için sır yöneticileri tercih edilir.
gradle-dotenv eklentisi (co.uzzu.dotenv) aracılığıyla. Eklenti, proje kökünden .env'yi okur ve değerleri BuildConfig'e aktarır. Değişkenler derleme aşamasında kodda BuildConfig.VARIABLE_NAME olarak kullanılabilir.
Evet, birçok ayrıştırıcı ${VAR_NAME} biçiminde enterpolasyonu destekler. Örneğin, URL=${HOST}:${PORT} aynı dosyadaki HOST ve PORT değerlerini değiştirecektir. Ancak bu yetenek belirli yükleyici kütüphanesine bağlıdır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun