এনভায়রনমেন্ট ভেরিয়েবল হল ডায়নামিক মান যা কোড পরিবর্তন না করে আচরণ কনফিগার করার জন্য অ্যাপ্লিকেশনকে স্টার্টআপে পাস করা হয়। এগুলো ডেভেলপমেন্ট, টেস্টিং এবং প্রোডাকশন কনফিগারেশন আলাদা করার অনুমতি দেয়। Twelve-Factor App, 2025 অনুসারে, কনফিগারেশন এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করা উচিত, কোডে নয়। এনভায়রনমেন্ট ভেরিয়েবল API কী, ব্যাকএন্ড URL এবং ফিচার ফ্ল্যাগের নিরাপদ ব্যবস্থাপনা নিশ্চিত করে।
মূল বিষয়
এনভায়রনমেন্ট ভেরিয়েবল হল একটি কী-মান জোড়া যা অপারেটিং সিস্টেম API-এর মাধ্যমে অ্যাপ্লিকেশন প্রক্রিয়ার জন্য অ্যাক্সেসযোগ্য। প্রক্রিয়াটি তৈরি করার সময় এগুলি পাস করা হয় এবং শুধুমাত্র এর রানটাইম চলাকালীন বিদ্যমান থাকে। সোর্স কোডে এম্বেড করা কনফিগারেশন প্যারামিটারের বিপরীতে, এনভায়রনমেন্ট ভেরিয়েবলের মান পরিবর্তন করতে পুনরায় কম্পাইলেশনের প্রয়োজন হয় না। এটি Twelve-Factor App-এর একটি মৌলিক নীতি, যা কোড এবং কনফিগারেশনের মধ্যে স্পষ্ট পৃথকীকরণ নিশ্চিত করে।
মোবাইল ডেভেলপমেন্টে, এনভায়রনমেন্ট ভেরিয়েবল বিভিন্ন পরিবেশের জন্য আলাদা কনফিগারেশন-এর সমস্যা সমাধান করে: ডেভেলপার লোকাল সার্ভার ব্যবহার করে, টেস্টার staging ব্যবহার করে এবং ব্যবহারকারীরা প্রোডাকশন ব্যবহার করে। কোডে if-else শর্তসহ তিনটি ব্যাকএন্ড URL সংরক্ষণ করার পরিবর্তে, ডেভেলপার বিল্ড সময়ে একটি এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে একটি URL পাস করে। এটি কোডকে সরল করে এবং পরীক্ষার পরিবেশে ভুলবশত প্রোডাকশন সার্ভার ব্যবহারের ঝুঁকি দূর করে।
প্রধান সুবিধা হল নিরাপত্তা: সংবেদনশীল ডেটা কোড রিপোজিটরিতে যায় না। API কী, Firebase সিক্রেট, ব্যাকএন্ড অ্যাক্সেস টোকেন এবং সার্টিফিকেট CI/CD-এর মাধ্যমে সরাসরি বিল্ড পরিবেশে লোড করা হয়। যদি কোনো আক্রমণকারী কোড রিপোজিটরিতে অ্যাক্সেস পায়, তাহলে সেখানে সিক্রেট পাবে না, কারণ সেগুলি CI সিস্টেমের সুরক্ষিত স্টোরেজে সংরক্ষিত থাকে এবং শুধুমাত্র বাইনারি ফাইল বিল্ড পর্যায়ে পাস করা হয়।
মোবাইল প্রজেক্টে কমপক্ষে তিনটি পরিবেশ থাকে: ডেভেলপমেন্ট, স্টেজিং এবং প্রোডাকশন। প্রতিটি পরিবেশের নিজস্ব কনফিগারেশন সেট প্রয়োজন: সার্ভার URL, প্যাকেজ নাম, স্বাক্ষর স্কিম এবং পুশ নোটিফিকেশন সার্টিফিকেট। এনভায়রনমেন্ট ভেরিয়েবল ছাড়া, ডেভেলপারকে প্রতিটি বিল্ডের আগে ম্যানুয়ালি কনফিগারেশন পরিবর্তন করতে হয়, যা ত্রুটির কারণ হয়: টেস্ট বিল্ডে ভুলে যাওয়া প্রোডাকশন কী প্রকৃত ব্যবহারকারীদের নোটিফিকেশন পাঠাতে পারে বা অর্থপ্রদত্ত API খরচ করতে পারে।
এনভায়রনমেন্ট ভেরিয়েবল কোড পরিবর্তন না করে ব্যাকএন্ড পরিবর্তনের অনুমতি দেয়: শুধু API_BASE_URL ভেরিয়েবলে মান পরিবর্তন করুন। ফিচার ফ্ল্যাগগুলি FEATURE_CHAT_ENABLED=true-এর মতো ভেরিয়েবলের মাধ্যমে পরিচালিত হয়, যা প্রোডাকশনকে প্রভাবিত না করে staging-এ নতুন বৈশিষ্ট্য সক্ষম করতে দেয়। প্রতিটি পরিবেশের নিজস্ব .env ফাইল থাকে যা বিল্ড সময়ে লোড হয়।
class AppConfig {
static final String apiBaseUrl =
const String.fromEnvironment('API_BASE_URL',
defaultValue: 'http://localhost:8080');
}
হার্ডকোডেড কী মোবাইল অ্যাপ্লিকেশনের একটি সাধারণ দুর্বলতা। একজন আক্রমণকারী jadx বা Hopper-এর মতো টুল ব্যবহার করে APK বা IPA ডিকম্পাইল করে এবং বাইনারি ফাইল থেকে সিক্রেট বের করে। এমনকি অবফাসকেশন স্ট্রিং লিটারেল রক্ষা করে না — ডিকম্পাইলেশনের পরে এগুলি কোডে সহজেই পাওয়া যায়। এনভায়রনমেন্ট ভেরিয়েবল CI/CD-এর মাধ্যমে বিল্ড সময়ে কী পাস করে এই সমস্যার সমাধান করে, যেখানে সেগুলি লগে মাস্ক করা হয়।
object Config {
val apiKey: String =
System.getenv("API_KEY") ?: throw
IllegalStateException("API_KEY not set")
}
এনভায়রনমেন্ট ভেরিয়েবল বিল্ড পাইপলাইনের সাথে একীভূত হয়: GitHub Actions, GitLab CI, Bitrise এবং CircleCI গোপন ভেরিয়েবল সমর্থন করে যা লগে প্রদর্শিত হয় না। বিল্ড সময়ে, CI ব্রাঞ্চ বা ট্যাগের উপর ভিত্তি করে উপযুক্ত মান প্রতিস্থাপন করে: develop ব্রাঞ্চের জন্য staging ব্যবহার করা হয়, v* ট্যাগের জন্য প্রোডাকশন ব্যবহার করা হয়। এটি প্রক্রিয়াটিকে স্বয়ংক্রিয় করে এবং মানবীয় ত্রুটি দূর করে, নিশ্চিত করে যে প্রতিটি বিল্ড সঠিক কনফিগারেশন সেট পায়।
.env ফাইল KEY=VALUE ফরম্যাটে এনভায়রনমেন্ট ভেরিয়েবল সংরক্ষণের একটি আদর্শ উপায়। এটি রিপোজিটরিতে অন্তর্ভুক্ত করা হয় না; পরিবর্তে, সমস্ত ভেরিয়েবলের টেমপ্লেট এবং খালি মান সহ .env.example যোগ করা হয়। প্রতিটি ডেভেলপার টিমের অন্যান্য সদস্যদের কনফিগারেশন প্রভাবিত না করে নিজস্ব .env ফাইল তৈরি করে। বিভিন্ন পরিবেশের জন্য আলাদা ফাইল ব্যবহার করা হয়: .env.dev, .env.stage, .env.prod।
# .env.example — ডেভেলপারদের জন্য টেমপ্লেট
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=
মোবাইল প্রজেক্টের জন্য, .env ফাইলের সাথে কাজ করার জন্য বিশেষ লাইব্রেরি রয়েছে:
CI/CD-তে ব্রাঞ্চিং সেটিংস বিভিন্ন .env ফাইল প্রতিস্থাপনের অনুমতি দেয়: টেস্ট সার্ভারের জন্য .env.dev, প্রি-রিলিজের জন্য .env.stage এবং অ্যাপ স্টোরে প্রকাশের জন্য .env.prod। সিক্রেটযুক্ত ফাইলগুলি নিরাপদ স্টোরেজ (Vault, AWS Secrets Manager) থেকে লোড করা হয় এবং রিপোজিটরিতে সংরক্ষণ করা হয় না। এটি নিশ্চিত করে যে ভার্সন কন্ট্রোল সিস্টেম আপোস করা হলেও, সিক্রেটগুলি সুরক্ষিত থাকে।
iOS ইকোসিস্টেম বিল্ড স্তরে ভেরিয়েবল পরিচালনার জন্য xcconfig ফাইল ব্যবহার করে। এগুলি Xcode স্কিমের সাথে সংযুক্ত থাকে এবং Debug এবং Release কনফিগারেশনের জন্য মান ওভাররাইড করার অনুমতি দেয়। xcconfig ফাইল ইনহেরিটেন্স সমর্থন করে: সাধারণ সেটিংস সহ একটি বেস ফাইল এবং প্রতিটি পরিবেশের জন্য নির্দিষ্ট ফাইল তৈরি করা যেতে পারে।
xcconfig ফাইল KEY = VALUE ফরম্যাটে ভেরিয়েবল সংরক্ষণ করে এবং Configuration সেটিংসের মাধ্যমে Xcode-এ বিল্ড স্কিমের সাথে সংযুক্ত হয়। xcconfig থেকে ভেরিয়েবল $(VARIABLE_NAME) সিনট্যাক্সের মাধ্যমে Info.plist-এ উপলব্ধ হয়, যা বিভিন্ন স্কিমের জন্য আলাদা বান্ডল আইডেন্টিফায়ার এবং অ্যাপ নামের অনুমতি দেয়। দ্রুত পরিবেশ সনাক্তকরণের জন্য, অ্যাপ নামে Dev বা Staging প্রত্যয় যোগ করা হয়।
# Config/Dev.xcconfig — ডেভেলপমেন্ট কনফিগারেশন
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev
iOS-এ রানটাইমে ভেরিয়েবল অ্যাক্সেসের জন্য, Configuration.swift ফাইল ব্যবহার করা হয়, যা Bundle.main.object(forInfoDictionaryKey:) এর মাধ্যমে Info.plist থেকে মান পড়ে। এই পদ্ধতি নিশ্চিত করে যে ভেরিয়েবলগুলি বিল্ড সময়ে সংজ্ঞায়িত হয় এবং লঞ্চের সাথে সাথেই অ্যাপ্লিকেশনের জন্য উপলব্ধ হয়। মানগুলি মডিউল ইনিশিয়ালাইজেশনের সময় একবার পড়া হয় এবং অ্যাপ্লিকেশন লাইফসাইকেল জুড়ে দ্রুত অ্যাক্সেসের জন্য ক্যাশে করা হয়।
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 BuildConfig-এর মাধ্যমে এনভায়রনমেন্ট ভেরিয়েবল সমর্থন করে — একটি স্বয়ংক্রিয়ভাবে তৈরি ক্লাস যার ফিল্ডগুলি মডিউলের build.gradle ফাইলে সংজ্ঞায়িত হয়। BuildConfig প্রতিটি ফ্লেভার এবং বিল্ড টাইপের জন্য আলাদাভাবে কম্পাইল সময়ে তৈরি হয়। এটি কোডে শর্তসাপেক্ষ অপারেটর ব্যবহার না করে ডিবাগ এবং রিলিজের জন্য আলাদা মান রাখতে দেয়, যা কর্মক্ষমতা এবং নিরাপত্তা উন্নত করে।
BuildConfig ফিল্ড defaultConfig বা নির্দিষ্ট buildTypes-এ buildConfigField-এর মাধ্যমে সেট করা হয়। প্রতিটি পরিবেশের জন্য আলাদা buildType বা productFlavor তৈরি করা হয়। এটি কঠোর কনফিগারেশন বিচ্ছিন্নতা নিশ্চিত করে: ডিবাগ লোকাল সার্ভার ব্যবহার করে, রিলিজ প্রোডাকশন ব্যবহার করে। BuildConfig ফিল্ড স্ট্যাটিকভাবে টাইপকৃত, যা কোডে অ্যাক্সেস করার সময় ত্রুটি দূর করে।
// 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\""
}
}
}
প্রজেক্ট রুটে gradle.properties ফাইল গ্লোবাল Gradle ভেরিয়েবল সংরক্ষণ করে। এগুলি $variableName সিনট্যাক্সের মাধ্যমে সমস্ত মডিউলে উপলব্ধ এবং ডিপেনডেন্সি ভার্সন, বিল্ড ফ্ল্যাগ এবং API কী নির্দিষ্ট করতে ব্যবহৃত হয়। BuildConfig-এর বিপরীতে, gradle.properties শুধুমাত্র Gradle কনফিগারেশন পর্যায়ে কাজ করে, অ্যাপ্লিকেশন রানটাইমে নয়। তাই, gradle.properties-এ উল্লেখিত পাসওয়ার্ড এবং API কী ডিকম্পাইলড কোডে দৃশ্যমান হয় না, কারণ এগুলি শুধুমাত্র কম্পাইল সময়ে BuildConfig তৈরি করতে ব্যবহৃত হয়।
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...
Android প্রজেক্টে সিক্রেট নিরাপদে স্থানান্তরের জন্য, local.properties (VCS থেকে বাদ) অথবা System.getenv()-এর মাধ্যমে build.gradle-এ CI/CD ভেরিয়েবল থেকে মান লোড করার পরামর্শ দেওয়া হয়। এটি নিশ্চিত করে যে কীগুলি রিপোজিটরিতে না যায়। Google Play Console-এ প্রকাশ করার সময়, নিশ্চিত করুন যে সমস্ত ডিবাগ কী সংশ্লিষ্ট BuildConfig মান সহ বিভিন্ন buildTypes বা productFlavors-এর মাধ্যমে প্রোডাকশন সংস্করণ দিয়ে প্রতিস্থাপিত হয়েছে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, Flutter রানটাইম অ্যাক্সেসের জন্য flutter_dotenv প্যাকেজের মাধ্যমে বা প্ল্যাটফর্ম ভেরিয়েবলের জন্য নেটিভ চ্যানেলের মাধ্যমে এনভায়রনমেন্ট ভেরিয়েবল সমর্থন করে। Dart-এ --dart-define-এর মাধ্যমে কম্পাইল সময়ে মান পাস করার জন্য String.fromEnvironment কনস্ট্রাক্টরও উপলব্ধ, যা Flutter প্রজেক্টের জন্য পছন্দের পদ্ধতি।
BuildConfig হল একটি Java ক্লাস যার টাইপকৃত ফিল্ড প্রতিটি buildType এবং flavor-এর জন্য কম্পাইল সময়ে তৈরি হয়। gradle.properties কী-মান জোড়া সহ একটি টেক্সট ফাইল যা বিল্ড কনফিগারেশন পর্যায়ে সমস্ত Gradle মডিউলের জন্য অ্যাক্সেসযোগ্য। BuildConfig অ্যাপ্লিকেশন রানটাইমে কাজ করে, gradle.properties — শুধুমাত্র Gradle স্ক্রিপ্টে।
আপনার রিপোজিটরির .gitignore ফাইলে .env যোগ করুন। রিপোজিটরিতে শুধুমাত্র খালি মান এবং প্রতিটি ভেরিয়েবলের বিবরণ সহ .env.example কমিট করুন। CI/CD-এর জন্য, GitHub Actions, GitLab CI বা Bitrise সেটিংসে এনক্রিপ্টেড সিক্রেট ব্যবহার করুন, যা লগে মাস্ক হয় এবং বিল্ড সম্পূর্ণ হওয়ার পরে পড়ার জন্য উপলব্ধ থাকে না।
বেশিরভাগ CI সিস্টেম গোপন এনভায়রনমেন্ট ভেরিয়েবল সমর্থন করে। GitHub Actions-এ এগুলি Secrets, GitLab CI-তে — CI/CD Variables, Bitrise-এ — Secrets। বিল্ড সময়ে, এগুলি process.env বা System.getenv()-এর মাধ্যমে বিল্ড স্ক্রিপ্টে পাস করা হয়। গোপন ভেরিয়েবল বিল্ড লগে প্রদর্শিত হয় না এবং রিপোজিটরি ফর্কে উপলব্ধ হয় না।
ফিচার ফ্ল্যাগ হল বুলিয়ান ভেরিয়েবল যা কোড পুনরায় কম্পাইল না করে কার্যকারিতা সক্ষম বা অক্ষম করা নিয়ন্ত্রণ করে। উদাহরণ: FEATURE_NEW_PAYMENT=true পরীক্ষার জন্য staging-এ একটি নতুন পেমেন্ট সিস্টেম সক্ষম করে। প্রোডাকশনে, একই ফ্ল্যাগ false-এ সেট থাকে যতক্ষণ না ব্যাকএন্ড সম্পূর্ণরূপে স্থাপন করা হয়। এটি ধাপে ধাপে নিরাপদে পরিবর্তন প্রয়োগ করতে এবং সমস্যা হলে সেগুলি ফিরিয়ে নিতে দেয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন