.env फ़ाइल एनवायरनमेंट वेरिएबल को सरल की-वैल्यू प्रारूप में संग्रहीत करती है और कॉन्फ़िगरेशन को एप्लिकेशन के स्रोत कोड से अलग करती है। The Twelve-Factor App (2011) के अनुसार, कॉन्फ़िगरेशन को कोड से सख्ती से अलग किया जाना चाहिए, और .env फ़ाइलें इस दृष्टिकोण का मानक बन गई हैं। .env File प्रोजेक्ट को पुनः संकलित किए बिना API कुंजियों, सर्वर URL और बिल्ड फ़्लैग के विभिन्न मानों को सम्मिलित करने की अनुमति देता है।
मुख्य बिंदु
.env File एक कॉन्फ़िगरेशन फ़ाइल है जो एनवायरनमेंट वेरिएबल को सरल टेक्स्ट प्रारूप KEY=VALUE में संग्रहीत करती है। प्रत्येक पंक्ति में एक वेरिएबल होता है: कुंजी का नाम और उसका मान, बराबर के चिह्न से अलग किया गया।
.env फ़ाइलें आधुनिक डेवलपमेंट की एक मूलभूत समस्या को हल करती हैं: विभिन्न वातावरण (स्थानीय, परीक्षण, उत्पादन) पूरी तरह से अलग सेटिंग्स की मांग करते हैं। स्थानीय मशीन पर API सर्वर URL http://localhost:8080 है, उत्पादन सर्वर पर https://api.production.com है। यदि ये मान सीधे एप्लिकेशन कोड में हार्डकोड किए गए हैं, तो प्रत्येक अलग वातावरण के लिए बिल्ड को स्रोत कोड बदलने की आवश्यकता होती है।
मुख्य एप्लिकेशन कोड के बाहर कॉन्फ़िगरेशन संग्रहीत करने की प्रथा को The Twelve-Factor App घोषणापत्र (2011) में मानकीकृत किया गया था, जिसने एनवायरनमेंट वेरिएबल को एप्लिकेशन कॉन्फ़िगर करने का एकमात्र सही तरीका बताया। JetBrains Developer Ecosystem सर्वेक्षण (2024) के अनुसार, 67% से अधिक मोबाइल डेवलपर अपने प्रोजेक्ट्स में .env फ़ाइलों का उपयोग करते हैं।
मोबाइल डेवलपमेंट के लिए, .env एक अतिरिक्त लाभ प्रदान करता है: मान बिल्ड चरण में Gradle (Android) या xcconfig (iOS) के माध्यम से प्रतिस्थापित किए जाते हैं, जिससे स्रोत कोड बदले बिना डेवलपमेंट, स्टेजिंग और प्रोडक्शन के लिए अलग-अलग बिल्ड बनाए जा सकते हैं।
.env टीम में काम करते समय विशेष रूप से उपयोगी है: प्रत्येक डेवलपर अपने वातावरण के अनुरूप सेटिंग्स के साथ अपनी स्थानीय .env बनाता है (स्थानीय DB पथ, डीबग API कुंजियाँ), जबकि सामान्य सेटिंग्स रिपॉजिटरी में .env.example के रूप में तय की जाती हैं। यह उस स्थिति को समाप्त करता है जहाँ git pull के बाद किसी डेवलपर का बिल्ड एक अज्ञात एनवायरनमेंट वेरिएबल की कमी के कारण टूट जाता है। टीम का नया सदस्य बस .env.example को .env में कॉपी करता है और अपने स्थानीय मान भरता है।
.env प्रारूप अत्यंत सरल है: प्रत्येक पंक्ति KEY=VALUE रूप में एक वेरिएबल है। बराबर के चिह्न के आसपास के स्थान आमतौर पर अनदेखा किए जाते हैं, लेकिन अधिकांश लाइब्रेरी में वे मान का हिस्सा माने जाते हैं, इसलिए उनसे बचना बेहतर है।
टिप्पणियाँ # चिह्न से शुरू होती हैं — इसके बाद की पूरी पंक्ति अनदेखा कर दी जाती है। खाली पंक्तियाँ भी छोड़ दी जाती हैं। यदि मान में स्थान हैं, तो इसे दोहरे या एकल उद्धरण चिह्नों में बंद किया जाता है।
# बुनियादी एनवायरनमेंट सेटिंग्स
APP_NAME=MyMobileApp
APP_ENV=development
# API कॉन्फ़िगरेशन
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# संवेदनशील डेटा
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
.env में सभी वेरिएबल स्ट्रिंग हैं, लेकिन लोडर लाइब्रेरी उन्हें आवश्यक प्रकार में बदल सकती हैं। विशेष वर्णों को एस्केप करने के लिए बैकस्लैश और उद्धरण चिह्नों का उपयोग किया जाता है। यदि मान में पाठ के भाग के रूप में # वर्ण है, तो इसे \# के रूप में एस्केप किया जाना चाहिए।
KEY=value या KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}.env लोड करते समय, लाइब्रेरी वेरिएबल इंटरपोलेशन कर सकती हैं — एक कुंजी के मान को दूसरी के अंदर प्रतिस्थापित करना। उदाहरण के लिए, वेरिएबल DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db उसी फ़ाइल से DB_USER और DB_PASS का विस्तार करेगा।
.env को जोड़ने की विधि प्लेटफ़ॉर्म पर निर्भर करती है। Android Gradle प्लगइन का उपयोग करता है, iOS — xcconfig कॉन्फ़िगरेशन फ़ाइलें, और क्रॉस-प्लेटफ़ॉर्म समाधान जैसे Flutter — विशेष लाइब्रेरी।
Android में, .env gradle-dotenv प्लगइन के माध्यम से लोड किया जाता है। प्लगइन प्रोजेक्ट की रूट से .env पढ़ता है और मानों को BuildConfig में जोड़ता है, जिसके बाद वे जनरेटेड फ़ील्ड के माध्यम से Kotlin या Java कोड में उपलब्ध होते हैं।
// build.gradle.kts (app level)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// कोड में पहुंच: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
iOS में, एनवायरनमेंट वेरिएबल आमतौर पर xcconfig फ़ाइलों के माध्यम से कॉन्फ़िगर किए जाते हैं। Swift में .env लोड करने के लिए DotEnv लाइब्रेरी या कस्टम कुंजियों के साथ अंतर्निहित Info.plist तंत्र का उपयोग किया जाता है।
// Swift प्रोजेक्ट में .env लोड करना
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 के लिए flutter_dotenv पैकेज मौजूद है, जो एप्लिकेशन इनिशियलाइज़ेशन के दौरान .env से वेरिएबल लोड करता है। .env फ़ाइल को प्रोजेक्ट की रूट में रखा जाता है, और वेरिएबल dotenv क्लास के माध्यम से उपलब्ध होते हैं।
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — स्टार्टअप पर लोड हो रहा है
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));
}
तीनों दृष्टिकोण एक सामान्य सिद्धांत साझा करते हैं: .env बिल्ड चरण में या एप्लिकेशन शुरू होने पर लोड किया जाता है, मान कैश किए जाते हैं और जनरेटेड कॉन्स्टेंट के माध्यम से कोड में उपयोग किए जाते हैं। यह संवेदनशील डेटा को रिपॉजिटरी में जाने से रोकता है।
React Native के लिए react-native-config पैकेज का उपयोग किया जाता है, जो बिल्ड चरण में प्रोजेक्ट की रूट में एक .env फ़ाइल से Android के लिए BuildConfig क्लास और iOS के लिए Info.plist में कॉन्स्टेंट स्वचालित रूप से जनरेट करता है। यह विशेष रूप से उन स्टार्टअप के लिए सुविधाजनक है जो Expo या bare workflow का उपयोग करते हैं: रूट स्तर पर एक .env सभी प्लेटफ़ॉर्म को कॉन्फ़िगरेशन दोहराए बिना समान एनवायरनमेंट वेरिएबल प्राप्त करने के लिए पर्याप्त है।
सभी लाभों के बावजूद, .env उत्पादन वातावरण में रहस्यों को संग्रहीत करने का पूर्ण समाधान नहीं है। यह सुरक्षा का एक बुनियादी स्तर प्रदान करता है, लेकिन यदि गलत तरीके से उपयोग किया जाए, तो यह गोपनीय डेटा के रिसाव का कारण बन सकता है।
सबसे महत्वपूर्ण नियम — .env कभी भी रिपॉजिटरी के संस्करण नियंत्रण प्रणाली में नहीं जाना चाहिए। फ़ाइल को बनाने के तुरंत बाद .gitignore में जोड़ा जाता है, और रिपॉजिटरी में केवल नमूना फ़ाइल .env.example खाली या नकली मानों के साथ कमिट की जाती है।
# .env.example — रिपॉजिटरी में कमिट किया गया
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — उदाहरण में भी निर्दिष्ट न करें!
# JWT_SECRET — उदाहरण में भी निर्दिष्ट न करें!
# .gitignore
# Dotenv फ़ाइलें
.env
.env*.local
उत्पादन प्रोजेक्ट्स के लिए, पेशेवर रहस्य प्रबंधन समाधानों का उपयोग करने की सिफारिश की जाती है। उत्पादन में .env केवल तभी स्वीकार्य है जब फ़ाइल सर्वर के document-root के बाहर स्थित हो और उसके सख्त एक्सेस अधिकार हों।
Snyk State of Open Source Security (2024) के अनुसार, रिपॉजिटरी के माध्यम से .env फ़ाइलों का रिसाव सर्वेक्षण में शामिल कंपनियों के बीच सभी API कुंजी प्रकटीकरण घटनाओं के 12% से अधिक का कारण था। एक समर्पित सीक्रेट मैनेजर का उपयोग इस जोखिम को शून्य तक कम कर देता है।
प्री-कमिट हुक के कार्यान्वयन के माध्यम से अतिरिक्त सुरक्षा प्राप्त की जाती है, जिसमें husky और lint-staged जैसे टूल का उपयोग किया जाता है, जो जाँचते हैं कि क्या डेवलपर ने गलती से .env को कमिट में जोड़ दिया है। git-secrets (AWS) और talisman जैसे टूल प्रत्येक कमिट को API कुंजियों, टोकन और पासवर्ड के पैटर्न के लिए स्कैन करते हैं, पाए जाने पर कमिट को ब्लॉक कर देते हैं। CI पाइपलाइन के लिए, detect-secrets जोड़ने की सिफारिश की जाती है — एक स्वचालित स्कैनर जो डेवलपर की गलती होने पर भी .env फ़ाइल को रिपॉजिटरी में नहीं जाने देगा।
अक्सर पूछे जाने वाले प्रश्न
नहीं, .env को Git में कमिट नहीं करना चाहिए। फ़ाइल में संवेदनशील डेटा होता है और इसे .gitignore में जोड़ा जाना चाहिए। इसके बजाय, रिपॉजिटरी में सभी आवश्यक वेरिएबल के टेम्पलेट के साथ .env.example रखा जाता है।
.env वास्तविक फ़ाइल है जिसमें उत्पादन मान होते हैं और इसे कभी कमिट नहीं किया जाता। .env.example फ़ाइल में समान कुंजियाँ होती हैं लेकिन खाली या नकली मानों के साथ — यह नए डेवलपर के लिए नमूने के रूप में रिपॉजिटरी में कमिट की जाती है।
हाँ, लेकिन अतिरिक्त सुरक्षा के बिना इसकी अनुशंसा नहीं की जाती है। यदि उत्पादन सर्वर पर .env का उपयोग किया जाता है, तो फ़ाइल को वेब सर्वर के document-root के बाहर 600 (केवल स्वामी) एक्सेस अधिकारों के साथ स्थित होना चाहिए। महत्वपूर्ण प्रोजेक्ट्स के लिए, सीक्रेट मैनेजर को प्राथमिकता दी जाती है।
gradle-dotenv प्लगइन (co.uzzu.dotenv) के माध्यम से। प्लगइन प्रोजेक्ट की रूट से .env पढ़ता है और मानों को BuildConfig में निर्यात करता है। वेरिएबल संकलन चरण में कोड में BuildConfig.VARIABLE_NAME के रूप में उपलब्ध होते हैं।
हाँ, कई पार्सर ${VAR_NAME} प्रारूप में इंटरपोलेशन का समर्थन करते हैं। उदाहरण के लिए, URL=${HOST}:${PORT} उसी फ़ाइल से HOST और PORT के मानों को प्रतिस्थापित करेगा। हालांकि, यह क्षमता विशिष्ट लोडर लाइब्रेरी पर निर्भर करती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें