كنت أخلط بين مفاتيح الإنتاج والتطوير: كيف أنقذتني أداة direnv من جحيم متغيرات البيئة الفوضوية؟

يا الله، لا زلت أذكر تلك الليلة وكأنها البارحة. الساعة الثانية صباحاً، عيناي نصف مغمضتين بفعل التعب، وفنجان القهوة الثالث بجانبي أصبح بارداً. كنت أعمل على تسليم تحديث عاجل لأحد العملاء، والمطلوب كان تعديلاً بسيطاً على سكربت يقوم بأرشفة بعض البيانات القديمة في قاعدة البيانات.

كنت أعمل على جهازي المحلي، وكل شيء كان يبدو طبيعياً. فتحت الـ terminal، وانتقلت لمجلد المشروع، وكتبت الأمر لتشغيل السكربت… وفجأة، شعرت بذلك الإحساس البارد في عمودي الفقري. لم تكن رسالة النجاح التي توقعتها، بل شيء مختلف. شيء يوحي بأنني قمت بتنفيذ الأمر على بيانات أكثر بكثير مما هو موجود في قاعدة بياناتي المحلية.

تصبب العرق من جبيني. “يا ويلي! شو اللي عملته؟”. ركضت بسرعة لأتفحص لوحة التحكم الخاصة بالعميل… نعم، لقد حدث ما كنت أخشاه. لقد قمت بتشغيل سكربت الأرشفة على قاعدة بيانات الإنتاج الحقيقية! يبدو أنني في وقت سابق من اليوم كنت أعمل على شيء يخص الإنتاج، وقمت بعمل `source .env.production` في الـ terminal ولم أقم بإغلاقه. وعندما عدت للمشروع، ورث نفس الـ terminal تلك المتغيرات الكارثية.

الحمد لله، وبفضل النسخ الاحتياطي الجيد، تمكنت من تدارك الموقف بعد بضع ساعات من التوتر الشديد والعمل المحموم. لكن تلك الليلة كانت نقطة تحول بالنسبة لي. أقسمت أنني لن أقع في هذا الفخ مرة أخرى. ومن هنا بدأت رحلة بحثي عن حل جذري لهذه الفوضى، رحلة انتهت بي عند أداة صغيرة لكنها عبقرية، اسمها: `direnv`.

ما هي متغيرات البيئة، ولماذا هي جحيم متنقل؟

قبل أن نغوص في الحل، دعونا نتفق على المشكلة. متغيرات البيئة (Environment Variables) هي ثوابت نستخدمها في تطبيقاتنا لتخزين معلومات حساسة أو متغيرة حسب البيئة التي يعمل فيها التطبيق. أشياء مثل:

  • مفاتيح الـ API (لخدمات مثل Stripe, Google Maps, etc).
  • بيانات الاتصال بقاعدة البيانات (DATABASE_URL).
  • إعدادات خاصة ببيئة التشغيل (NODE_ENV=development أو NODE_ENV=production).

المشكلة ليست في المتغيرات نفسها، بل في كيفية إدارتها. الطريقة التقليدية التي تعلمناها جميعاً كانت تعتمد على ملفات مثل `.env`، وكنا نتعامل معها بإحدى الطرق الفوضوية التالية:

الطريقة اليدوية البحتة: تقوم بإنشاء ملف `.env.development` و `.env.production`، وفي كل مرة تريد تبديل البيئة، تقوم يدوياً بتشغيل أمر مثل `source .env.development` في الطرفية (Terminal). والمشكلة؟ من السهل جداً أن تنسى أي ملف قمت بتفعيله، أو أن تفتح نافذة طرفية جديدة وتنسى تفعيل أي شيء من الأساس، مما يؤدي لساعات من تصحيح الأخطاء لاكتشاف أن متغير `DATABASE_URL` فارغ!

الطريقة “الذكية” قليلاً: إضافة أوامر `export` مباشرة إلى ملف `~/.bashrc` أو `~/.zshrc`. هذه الطريقة كارثية لأنها تجعل هذه المتغيرات عامة على مستوى النظام كله، مما يعني أن كل مشاريعك ستستخدم نفس المفاتيح، وهذا يسبب تضارباً وفوضى لا حدود لها.

هذه الفوضى هي مضيعة للطاقة الذهنية. فبدلاً من التركيز على حل المشاكل البرمجية الحقيقية، نجد أنفسنا نضيع الوقت في التأكد من أننا نستخدم مفتاح الـ API الصحيح.

أداة direnv: المنقذ الذي لم أكن أعرف أنني أحتاجه

ببساطة شديدة، `direnv` هي أداة لسطر الأوامر تقوم بتحميل وتفريغ متغيرات البيئة تلقائياً عند الدخول والخروج من مجلدات المشاريع.

الفكرة عبقرية في بساطتها: أنت تضع ملفاً صغيراً اسمه `.envrc` داخل مجلد مشروعك، وتكتب فيه متغيرات البيئة التي تخص هذا المشروع فقط. بمجرد أن تقوم بالدخول إلى هذا المجلد عبر أمر `cd` في الطرفية، تقوم `direnv` بقراءة هذا الملف وتحميل المتغيرات. وعندما تخرج من المجلد، تقوم `direnv` بتنظيف كل شيء وإزالة تلك المتغيرات من بيئة العمل الخاصة بك. لا أكثر ولا أقل.

كيف يعمل هذا السحر؟

الأمر ليس سحراً بالطبع. عند تثبيت `direnv`، تقوم بإضافة “خطّاف” (hook) إلى إعدادات الـ shell الخاص بك (مثل Bash أو Zsh). هذا الخطّاف يقوم بتشغيل `direnv` بعد كل أمر تقوم بتنفيذه في الطرفية. عندما يكون الأمر هو `cd` لتغيير المجلد، يرى `direnv` ذلك ويقوم بالبحث عن ملف `.envrc` في المجلد الجديد. إذا وجده، يقوم بتحميله. وإذا كان الأمر `cd ..` للخروج، يقوم بتفريغ متغيرات البيئة التي حملها من المجلد السابق. بسيط، فعال، وعبقري.

يلا نشتغل: تثبيت وإعداد direnv خطوة بخطوة

دعونا نقم بإعداد هذه الأداة الرائعة. العملية سهلة جداً وتتكون من ثلاث خطوات فقط.

الخطوة الأولى: التثبيت

تعتمد طريقة التثبيت على نظام التشغيل الذي تستخدمه. إليك أشهر الأوامر:

# على نظام macOS باستخدام Homebrew
brew install direnv

# على نظام Debian/Ubuntu
sudo apt-get install direnv

# على نظام Fedora
sudo dnf install direnv

يمكنك إيجاد طرق التثبيت لكل الأنظمة على الموقع الرسمي.

الخطوة الثانية: ربط الأداة بالـ Shell الخاص بك

هذه هي أهم خطوة وغالباً ما ينساها الناس. بعد التثبيت، يجب أن تخبر الـ shell الخاص بك كيف يستخدم `direnv`. قم بإضافة السطر المناسب إلى ملف الإعدادات الخاص بك:

إذا كنت تستخدم Bash: أضف السطر التالي في نهاية ملف `~/.bashrc`

eval "$(direnv hook bash)"

إذا كنت تستخدم Zsh (مثل معظم مستخدمي macOS الجدد): أضف السطر التالي في نهاية ملف `~/.zshrc`

eval "$(direnv hook zsh)"

بعد إضافة السطر، قم بإغلاق الطرفية وفتحها من جديد، أو نفذ الأمر `source ~/.bashrc` (أو `source ~/.zshrc`) لتفعيل التغييرات.

الخطوة الثالثة: أول مشروع لك مع direnv

الآن لنجربها عملياً. سنقوم بإنشاء مجلد مشروع جديد:

mkdir ~/my-first-direnv-project
cd ~/my-first-direnv-project

الآن، لنقم بإنشاء ملف `.envrc` الشهير ونضع فيه متغيراً بسيطاً:

echo 'export HELLO="Ahlan from direnv!"' > .envrc

بمجرد إنشاء الملف، ستلاحظ أن `direnv` أظهرت لك رسالة تحذيرية. هذا سلوك مقصود وميزة أمان رائعة:

direnv: error .envrc is blocked. Run `direnv allow .` to approve its content.

هذا يعني أن `direnv` لن تقوم بتشغيل أي سكربت بشكل عشوائي دون موافقتك الصريحة. هذا يحميك من تحميل مشروع من الإنترنت يحتوي على كود خبيث في ملف `.envrc`. للموافقة، قم بتشغيل الأمر الذي تقترحه:

direnv allow .

ستظهر لك رسالة تفيد بنجاح العملية:

direnv: loading ~/my-first-direnv-project/.envrc
direnv: export +HELLO

للتأكد من أن كل شيء يعمل، اطبع قيمة المتغير:

echo $HELLO

والنتيجة ستكون: `Ahlan from direnv!`

الآن، شاهد السحر الحقيقي. اخرج من المجلد:

cd ..

ستلاحظ رسالة جديدة:

direnv: unloading

إذا حاولت طباعة المتغير مرة أخرى، لن تجد له أي أثر:

echo $HELLO
# (لا يوجد أي مخرج، المتغير اختفى!)

هذا هو جوهر `direnv`. بيئة نظيفة ومنعزلة لكل مشروع، تعمل وتختفي تلقائياً.

نصائح من “أبو عمر”: الارتقاء باستخدام direnv للمستوى الاحترافي

الاستخدام البسيط رائع، لكن القوة الحقيقية لـ `direnv` تكمن في تكاملها مع أدوات أخرى. إليك بعض الأساليب التي أستخدمها يومياً:

1. لا تضع الأسرار في الـ git: استخدام `.env` مع `.envrc`

ملف `.envrc` يمكن وضعه في نظام إدارة الإصدارات (git) إذا كان يحتوي فقط على متغيرات عامة. لكن ماذا عن الأسرار والمفاتيح؟ الحل بسيط:

  1. أنشئ ملف `.env` تقليدي وضع فيه كل أسرارك (e.g., `API_KEY=…`).
  2. الأهم: أضف ملف `.env` إلى `.gitignore` فوراً! `echo “.env” >> .gitignore`
  3. في ملف `.envrc`، اكتب سطراً واحداً فقط: `dotenv`

هذا الأمر `dotenv` هو دالة مدمجة في `direnv` تقوم بقراءة ملف `.env` وتحميل متغيراته. بهذه الطريقة، يبقى ملف `.envrc` آمناً لوضعه في git، بينما تبقى أسرارك في ملف `.env` المحلي غير المرفوع.

# .envrc (آمن لوضعه في git)
dotenv

# .env (يجب أن يكون في .gitignore)
DATABASE_URL="postgres://user:pass@localhost/dev_db"
STRIPE_API_KEY="sk_test_..."

# .gitignore
.env

2. إدارة إصدارات اللغات والأدوات (Node, Python, etc.)

`direnv` لديها “تخطيطات” (layouts) ذكية. يمكنك استخدامها لتفعيل بيئة لغة معينة تلقائياً.

لمشاريع Python:

إذا كنت تستخدم البيئات الافتراضية (virtual environments)، يمكنك أن تطلب من `direnv` تفعيلها تلقائياً. فقط اكتب في `.envrc`:

# .envrc
layout python3

في المرة الأولى التي تدخل فيها المجلد، سيقوم `direnv` بإنشاء بيئة افتراضية في مجلد `.direnv`. وفي كل مرة تدخل بعدها، سيقوم بتفعيلها تلقائياً. وداعاً لأمر `source venv/bin/activate`!

لمشاريع Node.js:

نفس المبدأ ينطبق هنا. يمكنك استخدام `direnv` لتحديد إصدار Node الذي يجب استخدامه في هذا المشروع (إذا كنت تستخدم أداة مثل `nvm` أو `asdf`):

# .envrc
layout node
# أو إذا كنت تستخدم أداة أخرى
use node v18.17.1

هذا يضمن أنك وجميع أعضاء فريقك تستخدمون نفس إصدار Node بالضبط، مما يقضي على مشاكل “لكنها تعمل على جهازي!”.

3. التكامل مع المحرر (VS Code)

هذه أفضل ميزة جانبية. عندما تقوم بفتح مشروعك في VS Code من الطرفية التي تم تفعيل `direnv` فيها (عبر الأمر `code .`)، فإن محرر الكود يرث كل متغيرات البيئة تلقائياً! هذا يعني أن الطرفية المدمجة في VS Code، وأدوات التصحيح، والإضافات، كلها ستتمكن من رؤية متغيرات البيئة الصحيحة دون أي إعدادات إضافية.

الخلاصة: وداعاً للفوضى، ومرحباً بالإنتاجية المنظمة 🧘‍♂️

منذ أن بدأت باستخدام `direnv`، تغيرت طريقة عملي بالكامل. لم أعد أقلق بشأن أي بيئة أنا أعمل فيها، ولم أعد أخشى ارتكاب خطأ كارثي مثل الذي حدث معي في تلك الليلة. الأداة تعمل في الخلفية بصمت، وتوفر لي البيئة الصحيحة في الوقت الصحيح والمكان الصحيح.

نصيحتي لك: توقف عن إدارة متغيرات البيئة يدوياً. أنت كمطور، طاقتك الذهنية أثمن من أن تضيع في مهام متكررة وعرضة للخطأ. استثمر نصف ساعة من وقتك لإعداد `direnv`، وستوفر على نفسك ساعات طويلة من الألم والإحباط في المستقبل.

يلا، جربوها وخبروني شو رأيكم. الله يوفقكم يا جماعة! 😉

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

​معمارية البرمجيات

كان تاريخ قراراتنا يضيع في Slack: كيف أنقذتنا ‘سجلات القرارات المعمارية’ (ADRs) من جحيم ‘لماذا فعلنا ذلك؟’

هل سئمت من البحث في سجلات Slack لتفهم قرارًا تقنيًا تم اتخاذه قبل أشهر؟ في هذه المقالة، أشارككم كأبو عمر، مطور فلسطيني، كيف أنقذتنا سجلات...

30 أبريل، 2026 قراءة المزيد
خوارزميات

كانت حلولنا التعاودية (Recursive) تنسف موارد الخادم: كيف أنقذتنا ‘البرمجة الديناميكية’ من جحيم تكرار الحسابات؟

قصة حقيقية من قلب معارك البرمجة، حيث كادت خوارزمية تعاودية بريئة أن تدمر مشروعنا. نغوص في تفاصيل كيف أنقذتنا البرمجة الديناميكية (Dynamic Programming) ومفهوم التخزين...

30 أبريل، 2026 قراءة المزيد
البودكاست