يخزن ملف .env متغيرات البيئة بتنسيق بسيط من مفتاح-قيمة ويفصل التهيئة عن كود المصدر للتطبيق. وفقًا لـ The Twelve-Factor App (2011)، يجب فصل التهيئة بشكل صارم عن الكود، وأصبحت ملفات .env هي المعيار لهذا النهج. .env File يسمح بإدخال قيم مختلفة لمفاتيح API وعناوين URL للخادم وأعلام البناء دون إعادة ترجمة المشروع.
أهم النقاط
.env File هو ملف تكوين يخزن متغيرات البيئة بتنسيق نصي بسيط KEY=VALUE. يحتوي كل سطر على متغير واحد: اسم المفتاح وقيمته، مفصولين بعلامة يساوي.
تحل ملفات .env مشكلة أساسية في التطوير الحديث: البيئات المختلفة (محلية، اختبارية، إنتاجية) تتطلب إعدادات مختلفة تمامًا. عنوان URL لخادم API على الجهاز المحلي هو 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 المحلي الخاص به مع إعدادات لبيئته (مسار قاعدة البيانات المحلية، مفاتيح 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. لتحميل .env في Swift تُستخدم مكتبة DotEnv أو آلية Info.plist المدمجة مع مفاتيح مخصصة.
// تحميل .env في مشروع Swift
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، التي في مرحلة البناء تنشئ تلقائيًا فئة BuildConfig لـ Android وثوابت في Info.plist لـ iOS من ملف .env واحد في جذر المشروع. هذا مناسب بشكل خاص للشركات الناشئة التي تستخدم 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 عبر المستودعات سببًا في أكثر من 12% من جميع حوادث الكشف عن مفاتيح API بين الشركات التي شملها الاستطلاع. استخدام مدير أسرار مخصص يقلل هذا الخطر إلى الصفر.
يتم تحقيق حماية إضافية من خلال تطبيق خطافات ما قبل الرفع باستخدام أدوات مثل 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا