Ətraf mühit dəyişənləri: bu nədir, istifadəsi və mobil layihələrdə konfiqurasiyası

Müəllif: IT Sectr Dərc olunub: 2026-05-31 Oxuma vaxtı: 8 dəq

Ətraf mühit dəyişənləri — tətbiqin davranışını kodu dəyişmədən konfiqurasiya etmək üçün işəsalma mərhələsində tətbiqə ötürülən dinamik dəyərlərdir. Onlar inkişaf, test və istehsal mühitlərinin konfiqurasiyalarını ayırmağa imkan verir. Twelve-Factor App, 2025-ə görə, konfiqurasiya ətraf mühit dəyişənlərində saxlanmalıdır, koddakı deyil. Ətraf mühit dəyişənləri API açarlarının, backend URL-lərinin və funksionallıq bayraqlarının təhlükəsiz idarə edilməsini təmin edir.

Əsas məqamlar

  • Ətraf mühit dəyişənləri tətbiq konfiqurasiyasını müxtəlif işəsalma mühitləri üçün mənbə kodundan ayırır
  • .env faylları dəyişənləri KEY=VALUE formatında saxlayır və .gitignore vasitəsilə repozitoriyadan xaric edilir
  • iOS kompilyasiya mərhələsində dəyişənləri ötürmək üçün xcconfig və Build Settings istifadə edir
  • Android konfiqurasiya sahələri yaratmaq üçün BuildConfig və gradle.properties istifadə edir
  • Təhlükəsizlik: açarlar və tokenlər CI/CD vasitəsilə yüklənməlidir, koddakı və ya repozitoriyada saxlanmamalıdır

Ətraf mühit dəyişənləri nədir

Ətraf mühit dəyişənləri — əməliyyat sistemi API-si vasitəsilə tətbiq prosesinə çıxarılan açar-dəyər cütüdür. Onlar proses yaradılarkən ötürülür və yalnız onun işləmə müddəti ərzində mövcud olur. Mənbə koduna daxil edilmiş konfiqurasiya parametrlərindən fərqli olaraq, ətraf mühit dəyişənləri dəyərləri dəyişdirmək üçün yenidən kompilyasiya tələb etmir. Bu, kod və konfiqurasiya arasında dəqiq ayırma təmin edən Twelve-Factor App-in fundamental prinsipidir.

Mobil inkişafda ətraf mühit dəyişənləri müxtəlif mühitlər üçün konfiqurasiya problemini həll edir: tərtibatçı lokal serverdən, test edən staging-dən, istifadəçilər isə istehsal mühitindən istifadə edir. Koddakı if-else şərt operatorları ilə üç backend URL-sini saxlamaq əvəzinə, tərtibatçı qurma mərhələsində bir URL-ni ətraf mühit dəyişəni vasitəsilə ötürür. Bu, kodu sadələşdirir və test mühitində təsadüfən istehsal serverindən istifadə riskini aradan qaldırır.

Əsas üstünlük təhlükəsizlikdir: həssas məlumatlar kod repozitoriyasına daxil olmur. API açarları, Firebase sirləri, backend giriş tokenləri və sertifikatlar CI/CD vasitəsilə birbaşa qurma mühitinə yüklənir. Təcavüzkar kod repozitoriyasına giriş əldə etsə belə, orada sirləri tapmayacaq, çünki onlar CI sisteminin qorunan anbarlarında saxlanılır və yalnız ikili faylın qurulması mərhələsində ötürülür.

Mobil inkişafda ətraf mühit dəyişənləri nə üçün lazımdır

Mobil layihələr ən azı üç mühitə malikdir: development, staging və istehsal. Hər bir mühit öz konfiqurasiya dəstini tələb edir: server URL-si, paket adı, imza sxemi və push bildiriş sertifikatları. Ətraf mühit dəyişənləri olmadan tərtibatçı hər qurma əvvəli əl ilə konfiqurasiyanı dəyişməli olur ki, bu da səhvlərə gətirib çıxarır: unudulmuş istehsal açarı test qurmasında real istifadəçilərə bildiriş göndərilməsinə və ya pullu API-nin xərclənməsinə səbəb ola bilər.

Mühitlərin ayrılması

Ətraf mühit dəyişənləri kodu dəyişmədən backendi dəyişməyə imkan verir: API_BASE_URL dəyişənindəki dəyəri əvəz etmək kifayətdir. Funksionallıq bayraqları (feature flags) FEATURE_CHAT_ENABLED=true tipli dəyişənlər vasitəsilə idarə olunur ki, bu da istehsal mühitinə təsir etmədən staging-də yeni imkanları aktivləşdirməyə imkan verir. Hər bir mühit üçün qurma mərhələsində yüklənən öz .env faylı yaradılır.

dart
class AppConfig {
  static final String apiBaseUrl =
    const String.fromEnvironment('API_BASE_URL',
      defaultValue: 'http://localhost:8080');
}

Açarların təhlükəsizliyi

Sərt kodlaşdırılmış açarlar mobil tətbiqlərin geniş yayılmış zəiflikidir. Təcavüzkar jadx və ya Hopper kimi alətlərlə APK və ya IPA-nı dekompilyasiya edir və ikili fayldan sirləri çıxarır. Hətta obfuskasiya da string literal qorumur — onlar dekompilyasiyadan sonra koddakı asanlıqla tapılır. Ətraf mühit dəyişənləri bu problemi həll edir, açarları CI/CD vasitəsilə qurma mərhələsində ötürür, burada onlar jurnallarda maskalanır.

kotlin
object Config {
    val apiKey: String =
        System.getenv("API_KEY") ?: throw
            IllegalStateException("API_KEY not set")
}

CI/CD inteqrasiyası

Ətraf mühit dəyişənləri qurma pipeline-ları ilə inteqrasiya olunur: GitHub Actions, GitLab CI, Bitrise və CircleCI jurnallarda görünməyən gizli dəyişənləri dəstəkləyir. Qurma mərhələsində CI budaq və ya teqdən asılı olaraq müvafiq dəyərləri əvəz edir: develop budağı üçün staging, v* teqi üçün istehsal istifadə olunur. Bu, prosesi avtomatlaşdırır və insan faktorunu aradan qaldırır, hər qurmanın düzgün konfiqurasiya dəsti almasını təmin edir.

.env faylları və idarəetmə kitabxanaları

.env faylı ətraf mühit dəyişənlərini KEY=VALUE formatında saxlamaq üçün standart üsuldur. Repozitoriyaya daxil edilmir, bunun əvəzinə repozitoriyaya bütün dəyişənlərin şablonu və boş dəyərləri olan .env.example əlavə olunur. Hər bir tərtibatçı komandanın digər üzvlərinin konfiqurasiyasına təsir etmədən öz .env faylını yaradır. Müxtəlif mühitlər üçün ayrıca fayllar istifadə olunur: .env.dev, .env.stage, .env.prod.

bash
# .env.example — tərtibatçılar üçün şablon
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=

Mobil layihələr üçün .env faylları ilə işləmək üçün ixtisaslaşmış kitabxanalar mövcuddur:

  • flutter_dotenv (Flutter) — dəyişənləri .env-dən dotenv.load() vasitəsilə runtime-da yükləyir
  • BuildConfig (Android) — build.gradle dəyərlərindən tipləşdirilmiş sahələr yaradır
  • xcconfig (iOS) — konfiqurasiya fayllarını müxtəlif Xcode qurma sxemlərinə qoşur
  • react-native-config (React Native) — .env faylları vasitəsilə dəyişən idarəetməsi

CI/CD-də budaq parametrləri müxtəlif .env fayllarını əvəz etməyə imkan verir: test serverləri üçün .env.dev, buraxılışöncəsi üçün .env.stage və tətbiq mağazalarında nəşr üçün .env.prod. Sirləri olan fayllar təhlükəsiz anbarlardan (Vault, AWS Secrets Manager) yüklənir və repozitoriyada saxlanılmır. Bu, hətta versiya nəzarət sistemi kompromat edilsə belə, sirlərin qorunmasını təmin edir.

iOS layihələrində ətraf mühit dəyişənləri

iOS ekosistemi qurma səviyyəsində dəyişənləri idarə etmək üçün xcconfig fayllarından istifadə edir. Onlar Xcode sxemlərinə qoşulur və Debug və Release konfiqurasiyaları üçün dəyərləri ləğv etməyə imkan verir. xcconfig faylları miras almağı dəstəkləyir: ümumi parametrləri olan əsas fayl və hər bir mühit üçün spesifik fayllar yaradıla bilər.

xcconfig fayllarının konfiqurasiyası

xcconfig faylları dəyişənləri KEY = VALUE formatında saxlayır və Xcode-da Konfiqurasiya parametrləri vasitəsilə qurma sxeminə qoşulur. xcconfig-dən dəyişənlər Info.plist-də $(VARIABLE_NAME) sintaksisi vasitəsilə əlçatandır ki, bu da müxtəlif sxemlər üçün müxtəlif paket identifikatorları və tətbiq adları istifadə etməyə imkan verir. Mühiti tez müəyyən etmək üçün tətbiq adına Dev və ya Staging suffiksi əlavə olunur.

bash
# Config/Dev.xcconfig — tərtibat konfiqurasiyası
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev

Dəyişənləri oxumaq üçün Swift kodu

iOS-da dəyişənlərə runtime girişi üçün Bundle.main.object(forInfoDictionaryKey:) vasitəsilə Info.plist-dən dəyərləri oxuyan Configuration.swift faylı istifadə olunur. Bu yanaşma dəyişənlərin qurma mərhələsində təyin edilməsini və tətbiqin işə salınmasından dərhal sonra əlçatan olmasını təmin edir. Dəyərlər modulun inisializasiyası zamanı bir dəfə oxunur və tətbiqin həyat dövrü ərzində sürətli giriş üçün keşlənir.

swift
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 layihələrində ətraf mühit dəyişənləri

Android ətraf mühit dəyişənlərini BuildConfig — sahələri modulun build.gradle faylında təyin olunan avtomatik yaradılan sinif vasitəsilə dəstəkləyir. BuildConfig hər bir flavor və qurma növü üçün ayrıca kompilyasiya mərhələsində yaradılır. Bu, koddakı şərt operatorlarından istifadə etmədən debug və release üçün müxtəlif dəyərlərə malik olmağa imkan verir ki, bu da məhsuldarlığı və təhlükəsizliyi artırır.

BuildConfig sahələrinin konfiqurasiyası

BuildConfig sahələri defaultConfig-da və ya konkret buildTypes-da buildConfigField vasitəsilə təyin edilir. Hər bir mühit üçün ayrıca buildType və ya productFlavor yaradılır. Bu, konfiqurasiyaların ciddi izolyasiyasını təmin edir: debug lokal serverdən, release istehsal mühitindən istifadə edir. BuildConfig sahələri statik tipləşdirilmişdir ki, bu da koddakı müraciətlərdə səhvləri aradan qaldırır.

groovy
// 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\""
        }
    }
}

Ümumi dəyərlər üçün gradle.properties

Layihənin kökündəki gradle.properties faylı qlobal Gradle dəyişənlərini saxlayır. Onlar $variableName sintaksisi vasitəsilə bütün modullarda əlçatandır və asılılıqların versiyalarını, qurma bayraqlarını və API açarlarını göstərmək üçün istifadə olunur. BuildConfig-dən fərqli olaraq, gradle.properties yalnız Gradle konfiqurasiyası mərhələsində işləyir, tətbiqin runtime-da deyil. Buna görə də gradle.properties-də göstərilən parol və API açarları dekompilyasiya olunmuş koddakı görünmür, çünki onlar yalnız kompilyasiya mərhələsində BuildConfig yaratmaq üçün istifadə olunur.

groovy
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...

Android layihələrində sirlərin təhlükəsiz ötürülməsi üçün local.properties (VCS-dən xaric edilib) istifadə etmək və ya System.getenv() vasitəsilə CI/CD dəyişənlərindən dəyərləri build.gradle-a yükləmək tövsiyə olunur. Bu, açarların repozitoriyaya düşməməsini təmin edir. Google Play Console-da nəşr edərkən, bütün debug açarlarının müvafiq BuildConfig dəyərləri ilə müxtəlif buildTypes və ya productFlavors vasitəsilə istehsal versiyaları ilə əvəz edildiyinə əmin olun.

Tez-tez verilən suallar

Flutter-da ətraf mühit dəyişənlərindən istifadə etmək olarmı?

Bəli, Flutter ətraf mühit dəyişənlərini runtime girişi üçün flutter_dotenv paketi və ya platforma dəyişənləri üçün yerli kanallar vasitəsilə dəstəkləyir. Dart-da həmçinin --dart-define vasitəsilə kompilyasiya mərhələsində dəyərləri ötürmək üçün String.fromEnvironment konstruktoru mövcuddur ki, bu da Flutter layihələri üçün üstünlük verilən üsuldur.

BuildConfig və gradle.properties arasında nə fərq var?

BuildConfig — hər bir buildType və flavor üçün kompilyasiya mərhələsində yaradılan tipləşdirilmiş sahələri olan Java sinifidir. gradle.properties — bütün Gradle modulları üçün qurma konfiqurasiyası mərhələsində əlçatan olan açar-dəyər cütlərindən ibarət mətn faylıdır. BuildConfig tətbiqin runtime-da işləyir, gradle.properties isə yalnız Gradle skriptlərində işləyir.

.env faylının repozitoriyaya sızmasının qarşısını necə almaq olar?

Repozitoriyanızın .gitignore faylına .env əlavə edin. Repozitoriyaya yalnız boş dəyərlər və hər bir dəyişənin təsviri ilə .env.example commitleyin. CI/CD üçün GitHub Actions, GitLab CI və ya Bitrise parametrlərində jurnallarda maskalanan və qurma başa çatdıqdan sonra oxunması mümkün olmayan şifrələnmiş sirlərdən istifadə edin.

Ətraf mühit dəyişənlərini CI/CD vasitəsilə necə ötürmək olar?

Əksər CI sistemləri gizli ətraf mühit dəyişənlərini dəstəkləyir. GitHub Actions-da bunlar Secrets, GitLab CI-da — CI/CD Variables, Bitrise-də — Secrets adlanır. Qurma mərhələsində onlar qurma skriptinə process.env və ya System.getenv() vasitəsilə ötürülür. Gizli dəyişənlər qurma jurnallarında göstərilmir və repozitoriyanın fork-larında əlçatan deyil.

Ətraf mühit dəyişənləri vasitəsilə feature flags nədir?

Feature flags — kodu yenidən kompilyasiya etmədən funksionallığı aktivləşdirən və ya söndürən boolean dəyişənlərdir. Nümunə: FEATURE_NEW_PAYMENT=true test üçün staging-də yeni ödəniş sistemini aktivləşdirir. İstehsalda eyni bayraq backend tam yerləşdirilənə qədər false olaraq təyin edilir. Bu, dəyişiklikləri mərhələli şəkildə təhlükəsiz tətbiq etməyə və problemlər olduqda geri qaytarmağa imkan verir.

Nəticə

  • Ətraf mühit dəyişənləri müxtəlif inkişaf mühitləri üçün konfiqurasiyanı mənbə kodundan ayırır
  • .env faylları .env.example şablonu ilə mühitlər arasında fərq qoyan komandalarda dəyişən idarəetmə standartıdır
  • iOS xcconfig miras və Info.plist inteqrasiyası dəstəyi ilə konfiqurasiya fayllarını Xcode sxemlərinə qoşur
  • Android BuildConfig hər bir buildType üçün ayrıca build.gradle-dan tipləşdirilmiş sahələr yaradır
  • CI/CD sirləri həssas məlumatları repozitoriyada saxlamadan qurma mərhələsində ötürür
  • Feature flags dəyişənlər vasitəsilə yenidən kompilyasiya etmədən konkret mühitdə funksionallığı aktivləşdirməyə imkan verir
  • Təhlükəsizlik: açarlar CI-də şifrələnir və tətbiqin dekompilyasiya edilə bilən ikili faylına düşmür

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.

Layihəni müzakirə et

Həm də oxuyun