Ortam değişkenleri, kodu değiştirmeden davranışı yapılandırmak için uygulama başlatılırken iletilen dinamik değerlerdir. Geliştirme, test ve üretim yapılandırmalarını ayırmaya olanak tanırlar. Twelve-Factor App, 2025'e göre, yapılandırma kodda değil, ortam değişkenlerinde saklanmalıdır. Ortam değişkenleri, API anahtarlarının, backend URL'sinin ve özellik bayraklarının güvenli yönetimini sağlar.
Önemli Noktalar
Ortam değişkenleri, işletim sistemi API'si aracılığıyla uygulama süreci tarafından erişilebilen anahtar-değer çiftleridir. Süreç oluşturulduğunda iletilir ve yalnızca çalışma süresi boyunca var olurlar. Kaynak koduna gömülü yapılandırma parametrelerinin aksine, ortam değişkenleri değerleri değiştirmek için yeniden derleme gerektirmez. Bu, Twelve-Factor App'in temel bir ilkesidir ve kod ile yapılandırma arasında net bir ayrım sağlar.
Mobil geliştirmede, ortam değişkenleri farklı ortamlar için farklı yapılandırma sorununu çözer: geliştirici yerel bir sunucu kullanır, test uzmanı staging kullanır ve kullanıcılar üretim kullanır. Kodda if-else koşullarıyla üç backend URL'si depolamak yerine, geliştirici derleme zamanında bir ortam değişkeni aracılığıyla tek bir URL iletir. Bu, kodu basitleştirir ve test ortamında yanlışlıkla üretim sunucusunu kullanma riskini ortadan kaldırır.
Ana avantaj güvenliktir: hassas veriler kod deposuna sızmaz. API anahtarları, Firebase sırları, backend erişim tokenları ve sertifikalar CI/CD aracılığıyla doğrudan derleme ortamına yüklenir. Bir saldırgan kod deposuna erişirse, orada sır bulamaz çünkü bunlar CI sisteminin korumalı depolarında saklanır ve yalnızca ikili dosya derleme aşamasında iletilir.
Mobil projeler en az üç ortama sahiptir: geliştirme, staging ve üretim. Her ortam kendi yapılandırma kümesini gerektirir: sunucu URL'si, paket adı, imzalama şeması ve push bildirimi sertifikaları. Ortam değişkenleri olmadan, geliştirici her derlemeden önce yapılandırmayı manuel olarak değiştirmek zorunda kalır ve bu da hatalara yol açar: test derlemesinde unutulan bir üretim anahtarı, gerçek kullanıcılara bildirim gönderilmesine veya ücretli API tüketimine neden olabilir.
Ortam değişkenleri, kodu değiştirmeden backend değiştirmeye olanak tanır: sadece API_BASE_URL değişkenindeki değeri değiştirin. Özellik bayrakları FEATURE_CHAT_ENABLED=true gibi değişkenler aracılığıyla yönetilir ve üretimi etkilemeden staging'de yeni özelliklerin etkinleştirilmesine olanak tanır. Her ortamın derleme zamanında yüklenen kendi .env dosyası vardır.
class AppConfig {
static final String apiBaseUrl =
const String.fromEnvironment('API_BASE_URL',
defaultValue: 'http://localhost:8080');
}
Sabit kodlanmış anahtarlar, mobil uygulamalarda yaygın bir güvenlik açığıdır. Bir saldırgan jadx veya Hopper gibi araçlar kullanarak APK veya IPA'yı derlemesinden çıkarır ve ikili dosyadan sırları çıkarır. Karartma bile dize değişmezlerini korumaz — derleme çözme işleminden sonra kodda kolayca bulunurlar. Ortam değişkenleri, CI/CD aracılığıyla derleme zamanında anahtarları ileterek bu sorunu çözer ve burada günlüklerde maskelenirler.
object Config {
val apiKey: String =
System.getenv("API_KEY") ?: throw
IllegalStateException("API_KEY not set")
}
Ortam değişkenleri derleme boru hatlarıyla entegre olur: GitHub Actions, GitLab CI, Bitrise ve CircleCI, günlüklerde görüntülenmeyen gizli değişkenleri destekler. Derleme zamanında, CI dal veya etikete bağlı olarak uygun değerleri değiştirir: develop dalı için staging kullanılır, v* etiketi için üretim kullanılır. Bu, süreci otomatikleştirir ve insan faktörünü ortadan kaldırarak her derlemenin doğru yapılandırma kümesini almasını sağlar.
.env dosyası, ortam değişkenlerini KEY=VALUE formatında saklamanın standart bir yoludur. Depoya dahil edilmez; bunun yerine, tüm değişkenlerin bir şablonu ve boş değerlerle .env.example eklenir. Her geliştirici, ekip üyelerinin yapılandırmalarını etkilemeden kendi .env dosyasını yerel ayarlarla oluşturur. Farklı ortamlar için ayrı dosyalar kullanılır: .env.dev, .env.stage, .env.prod.
# .env.example — geliştiriciler için şablon
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=
Mobil projeler için .env dosyalarıyla çalışmak üzere özel kütüphaneler bulunmaktadır:
CI/CD'de dal ayarları, farklı .env dosyalarının değiştirilmesine olanak tanır: test sunucuları için .env.dev, ön sürüm için .env.stage ve uygulama mağazalarında yayınlama için .env.prod. Sır içeren dosyalar güvenli bir depodan (Vault, AWS Secrets Manager) yüklenir ve depoda saklanmaz. Bu, sürüm kontrol sistemi tehlikeye girse bile sırların korunmasını sağlar.
iOS ekosistemi, derleme seviyesinde değişkenleri yönetmek için xcconfig dosyaları kullanır. Bunlar Xcode şemalarına eklenir ve Debug ile Release yapılandırmaları için değerlerin geçersiz kılınmasına olanak tanır. xcconfig dosyaları kalıtımı destekler: ortak ayarlarla bir temel dosya ve her ortam için belirli dosyalar oluşturulabilir.
xcconfig dosyaları değişkenleri KEY = VALUE formatında saklar ve Configuration ayarları aracılığıyla Xcode'da bir derleme şemasına eklenir. xcconfig'ten değişkenler $(DEĞİŞKEN_ADI) sözdizimi aracılığıyla Info.plist'te kullanılabilir ve farklı şemalar için farklı paket tanımlayıcıları ve uygulama adlarına olanak tanır. Hızlı ortam tanımlaması için uygulama adına Dev veya Staging soneki eklenir.
# Config/Dev.xcconfig — geliştirme yapılandırması
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev
iOS'te çalışma zamanında değişkenlere erişim için Configuration.swift dosyası kullanılır ve Bundle.main.object(forInfoDictionaryKey:) aracılığıyla Info.plist'ten değerleri okur. Bu yaklaşım, değişkenlerin derleme zamanında tanımlanmasını ve başlatmadan hemen sonra uygulama tarafından kullanılabilir olmasını garanti eder. Değerler modül başlatma sırasında bir kez okunur ve uygulama yaşam döngüsü boyunca hızlı erişim için önbelleğe alınır.
enum AppEnvironment {
static var apiBaseURL: URL {
guard let urlString = Bundle.main
.object(forInfoDictionaryKey: "API_BASE_URL"),
let url = URL(string: urlString as! String)
else { fatalError("API_BASE_URL is not configured") }
return url
}
static var isChatEnabled: Bool {
Bundle.main.object(
forInfoDictionaryKey: "FEATURE_CHAT_ENABLED"
) as? Bool ?? false
}
}
Android, ortam değişkenlerini BuildConfig aracılığıyla destekler — alanları modülün build.gradle dosyasında tanımlanan otomatik olarak oluşturulan bir sınıf. BuildConfig, her flavor ve derleme türü için ayrı ayrı derleme zamanında oluşturulur. Bu, kodda koşullu işleçler kullanmadan hata ayıklama ve sürüm için farklı değerlere sahip olmayı sağlar, performansı ve güvenliği artırır.
BuildConfig alanları, defaultConfig veya belirli buildTypes'da buildConfigField aracılığıyla ayarlanır. Her ortam için ayrı bir buildType veya productFlavor oluşturulur. Bu, katı yapılandırma izolasyonu sağlar: hata ayıklama yerel sunucu kullanır, sürüm üretim kullanır. BuildConfig alanları statik olarak tür belirtilmiştir, bu da kodda bunlara erişirken hataları ortadan kaldırır.
// build.gradle (Module: app)
android {
defaultConfig {
buildConfigField "String", "API_BASE_URL",
"\"http://localhost:8080\""
}
buildTypes {
debug {
buildConfigField "String", "API_BASE_URL",
"\"http://dev.api.itsectr.com\""
}
release {
buildConfigField "String", "API_BASE_URL",
"\"https://api.itsectr.com\""
}
}
}
Proje kökündeki gradle.properties dosyası, global Gradle değişkenlerini saklar. Bunlar $variableName sözdizimi aracılığıyla tüm modüllerde kullanılabilir ve bağımlılık sürümlerini, derleme bayraklarını ve API anahtarlarını belirtmek için kullanılır. BuildConfig'un aksine, gradle.properties yalnızca Gradle yapılandırma aşamasında çalışır, uygulama çalışma zamanında değil. Bu nedenle, gradle.properties'te belirtilen şifreler ve API anahtarları derlenmiş kodu çözülmüş kodda görünmez, çünkü bunlar yalnızca derleme zamanında BuildConfig oluşturmak için kullanılır.
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...
Android projelerinde sırların güvenli aktarımı için, local.properties (VCS dışında) kullanılması veya System.getenv() aracılığıyla build.gradle'da CI/CD değişkenlerinden değerlerin yüklenmesi önerilir. Bu, anahtarların depoya sızmamasını sağlar. Google Play Console'da yayınlarken, tüm hata ayıklama anahtarlarının ilgili BuildConfig değerlerine sahip farklı buildTypes veya productFlavors aracılığıyla üretim sürümleriyle değiştirildiğinden emin olun.
Sıkça Sorulan Sorular
Evet, Flutter, çalışma zamanı erişimi için flutter_dotenv paketi veya platform değişkenleri için yerel kanallar aracılığıyla ortam değişkenlerini destekler. Dart ayrıca --dart-define aracılığıyla derleme zamanında değerleri iletmek için String.fromEnvironment yapıcısını sunar ve bu Flutter projeleri için tercih edilen yöntemdir.
BuildConfig, her buildType ve flavor için derleme zamanında oluşturulan tür belirtilmiş alanlara sahip bir Java sınıfıdır. gradle.properties, derleme yapılandırma aşamasında tüm Gradle modülleri tarafından erişilebilen anahtar-değer çiftlerine sahip bir metin dosyasıdır. BuildConfig uygulama çalışma zamanında çalışır, gradle.properties — yalnızca Gradle betiklerinde.
Deponuzun .gitignore dosyasına .env ekleyin. Depoya yalnızca boş değerler ve her değişkenin açıklamasıyla .env.example ekleyin. CI/CD için, GitHub Actions, GitLab CI veya Bitrise ayarlarında günlüklerde maskelenen ve derleme tamamlandıktan sonra okunamayan şifrelenmiş sırlar kullanın.
Çoğu CI sistemi gizli ortam değişkenlerini destekler. GitHub Actions'ta bunlar Secrets, GitLab CI'da — CI/CD Değişkenleri, Bitrise'te — Secrets'tır. Derleme zamanında, process.env veya System.getenv() aracılığıyla derleme betiğine iletilirler. Gizli değişkenler derleme günlüklerinde görüntülenmez ve depo çatallarında kullanılamaz.
Özellik bayrakları, kodu yeniden derlemeden işlevselliğin etkinleştirilmesini veya devre dışı bırakılmasını kontrol eden boolean değişkenlerdir. Örnek: FEATURE_NEW_PAYMENT=true, test için staging'de yeni bir ödeme sistemini etkinleştirir. Üretimde, backend tamamen dağıtılana kadar aynı bayrak false olarak ayarlanır. Bu, değişikliklerin aşamalı olarak güvenli bir şekilde dağıtılmasına ve sorun olması durumunda geri alınmasına olanak tanı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