قم بالرقائق لتحميل متغيرات البيئة من .env
إلى ENV
قيد التطوير .
يعد تخزين التكوين في البيئة أحد مبادئ التطبيق المكون من اثني عشر عاملاً. يجب استخراج أي شيء من المحتمل أن يتغير بين بيئات النشر - مثل مقابض الموارد لقواعد البيانات أو بيانات الاعتماد للخدمات الخارجية - من التعليمات البرمجية إلى متغيرات البيئة.
ولكن ليس من العملي دائمًا تعيين متغيرات البيئة على أجهزة التطوير أو خوادم التكامل المستمر حيث يتم تشغيل مشاريع متعددة. يقوم dotenv بتحميل المتغيرات من ملف .env
إلى ENV
عندما يتم تشغيل البيئة.
أضف هذا السطر إلى الجزء العلوي من ملف Gemfile الخاص بالتطبيق الخاص بك وقم بتشغيل bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
أضف تكوين التطبيق الخاص بك إلى ملف .env
الخاص بك في جذر مشروعك:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
كلما تم تحميل تطبيقك، ستكون هذه المتغيرات متاحة في ENV
:
config . fog_directory = ENV [ 'S3_BUCKET' ]
راجع مستندات API للمزيد.
سيتم تحميل Dotenv تلقائيًا عند تشغيل تطبيق Rails. راجع تخصيص ريلز لتغيير الملفات التي سيتم تحميلها ومتى.
قم بتحميل Dotenv في أقرب وقت ممكن في عملية تمهيد التطبيق الخاص بك:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
افتراضيًا، سيبحث load
عن ملف يسمى .env
في دليل العمل الحالي. قم بتمرير ملفات متعددة وسيتم تحميلها بالترتيب. القيمة الأولى التي تم تعيينها للمتغير ستفوز.
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
منذ الإصدار 3.0، سيقوم dotenv في تطبيق Rails باستعادة ENV
تلقائيًا بعد كل اختبار. وهذا يعني أنه يمكنك تعديل ENV
في اختباراتك دون الخوف من تسرب الحالة إلى اختبارات أخرى. وهو يعمل مع كل ActiveSupport::TestCase
و Rspec
.
لتعطيل هذا السلوك، قم بتعيين config.dotenv.autorestore = false
في config/application.rb
أو config/environments/test.rb
. يتم تعطيله افتراضيًا إذا كان تطبيقك يستخدم التحكم في المناخ أو Ice_age.
لاستخدام هذا السلوك خارج تطبيق Rails، ما عليك سوى require "dotenv/autorestore"
في مجموعة الاختبار الخاصة بك.
راجع Dotenv.save
وDotenv.restore و Dotenv.modify(hash) { ... }
للاستخدام اليدوي.
للتأكد من تحميل .env
في Rake، قم بتحميل المهام:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
يمكنك استخدام التحميل القابل للتنفيذ dotenv
.env
قبل تشغيل التطبيق الخاص بك:
$ dotenv ./script.rb
يقبل الملف القابل للتنفيذ dotenv
أيضًا العلامة -f
. يجب أن تكون قيمتها قائمة مفصولة بفواصل من ملفات التكوين، بالترتيب من الأكثر أهمية إلى الأقل. يجب أن تكون كافة الملفات موجودة. يجب أن يكون هناك مسافة بين العلم وقيمته.
$ dotenv -f " .env.local,.env " ./script.rb
يمكن للملف القابل للتنفيذ dotenv
أن يتجاهل بشكل اختياري الملفات المفقودة باستخدام العلامة -i
أو --ignore
. على سبيل المثال، إذا كان الملف .env.local
غير موجود، فسيقوم ما يلي بتجاهل الملف المفقود وتحميل الملف .env
فقط.
$ dotenv -i -f " .env.local,.env " ./script.rb
إذا كنت تستخدم جواهر تتطلب تعيين متغيرات البيئة قبل تحميلها، فقم بإدراج dotenv
في Gemfile
قبل تلك الجواهر الأخرى وتتطلب dotenv/load
.
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
سوف يقوم Dotenv بتحميل الملفات التالية اعتمادًا على RAILS_ENV
، حيث يكون للملف الأول أعلى أسبقية، و .env
له أدنى أسبقية:
أولوية | بيئة | .gitignore ذلك؟ | ملحوظات | ||
---|---|---|---|---|---|
تطوير | امتحان | إنتاج | |||
أعلى | .env.development.local | .env.test.local | .env.production.local | نعم | التجاوزات المحلية الخاصة بالبيئة |
الثاني | .env.local | لا يوجد | .env.local | نعم | التجاوزات المحلية |
الثالث | .env.development | .env.test | .env.production | لا | المتغيرات الخاصة بالبيئة المشتركة |
آخر | .env | .env | .env | ربما | مشتركة لجميع البيئات |
يتم تحميل هذه الملفات أثناء رد الاتصال before_configuration
، والذي يتم إطلاقه عندما يتم تعريف ثابت Application
في config/application.rb
مع class Application < Rails::Application
. إذا كنت بحاجة إلى تهيئته عاجلاً، أو كنت بحاجة إلى تخصيص عملية التحميل، فيمكنك القيام بذلك في الجزء العلوي من application.rb
# config/application.rb
Bundler . require ( * Rails . groups )
# Load .env.local in test
Dotenv :: Rails . files . unshift ( ".env.local" ) if ENV [ "RAILS_ENV" ] == "test"
module YourApp
class Application < Rails :: Application
# ...
end
end
الخيارات المتاحة:
Dotenv::Rails.files
- قائمة الملفات التي سيتم تحميلها، حسب الأسبقية.Dotenv::Rails.overwrite
- الكتابة فوق متغيرات ENV
الموجودة بمحتويات ملفات .env*
Dotenv::Rails.logger
- المُسجل الذي سيتم استخدامه لتسجيل dotenv. الإعدادات الافتراضية هي Rails.logger
Dotenv::Rails.autorestore
- تمكين أو تعطيل الاستعادة التلقائيةيجب أن تكون القيم متعددة الأسطر مع فواصل الأسطر محاطة بعلامات اقتباس مزدوجة.
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
قبل الإصدار 3.0، كان dotenv يستبدل n
في السلاسل المقتبسة بسطر جديد، ولكن تم إهمال هذا السلوك. لاستخدام السلوك القديم، قم بتعيين DOTENV_LINEBREAK_MODE=legacy
قبل أي متغيرات تتضمن n
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
هل تحتاج إلى إضافة مخرجات الأمر في أحد المتغيرات الخاصة بك؟ ما عليك سوى إضافته باستخدام $(your_command)
:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
هل تحتاج إلى إضافة قيمة متغير آخر في أحد متغيراتك؟ يمكنك الإشارة إلى المتغير باستخدام ${VAR}
أو غالبًا $VAR
فقط في القيم غير المقتبسة أو ذات علامات الاقتباس المزدوجة.
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
إذا كانت القيمة تحتوي على $
ولم يكن المقصود منها أن تكون متغيرًا، فقم بتضمينها بين علامتي اقتباس مفردتين.
PASSWORD= ' pas$word '
يمكن إضافة التعليقات إلى ملفك على هذا النحو:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
من أجل التوافق، يمكنك أيضًا إضافة export
أمام كل سطر حتى تتمكن من source
الملف في bash:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
إذا كانت قيمة تكوين معينة مطلوبة ولكن لم يتم تعيينها، فمن المناسب ظهور خطأ.
لطلب مفاتيح التكوين:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
إذا لم يتم تعيين أي من مفاتيح التكوين المذكورة أعلاه، فسيظهر تطبيقك خطأ أثناء التهيئة. تُفضل هذه الطريقة لأنها تمنع حدوث أخطاء وقت التشغيل في تطبيق الإنتاج بسبب التكوين غير الصحيح.
لتحليل قائمة ملفات env للفحص البرمجي دون تعديل ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
تقوم هذه الطريقة بإرجاع تجزئة لأزواج اسم/قيمة ENV var.
يمكنك استخدام علامة -t
أو --template
على dotenv cli لإنشاء قالب لملف .env
الخاص بك.
$ dotenv -t .env
سيتم إنشاء قالب في دليل العمل الخاص بك باسم {FILENAME}.template
. لذلك في المثال أعلاه، سيتم إنشاء ملف .env.template
.
سيحتوي القالب على كافة متغيرات البيئة في ملف .env
الخاص بك ولكن مع تعيين قيمها على أسماء المتغيرات.
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
سوف تصبح
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
تم إنشاء dotenv في الأصل لتحميل متغيرات التكوين إلى ENV
قيد التطوير . توجد عادةً طرق أفضل لإدارة التكوين في بيئات الإنتاج - مثل /etc/environment
Managed by Puppet أو Chef، heroku config
، وما إلى ذلك.
ومع ذلك، يرى البعض أن dotenv طريقة مناسبة لتكوين تطبيقات Rails في بيئات التشغيل المرحلي والإنتاج، ويمكنك القيام بذلك عن طريق تحديد ملفات خاصة بالبيئة مثل .env.production
أو .env.test
.
إذا كنت تستخدم هذه الجوهرة للتعامل مع env vars لبيئات Rails المتعددة (التطوير، الاختبار، الإنتاج، وما إلى ذلك)، يرجى ملاحظة أنه يجب تخزين env vars العامة لجميع البيئات في .env
. بعد ذلك، يجب تخزين env vars الخاص بالبيئة في .env.<that environment's name>
.
يجب أن يكون الوصول إلى بيانات الاعتماد متاحًا فقط على الأجهزة التي تحتاج إلى الوصول إليها. لا تقم أبدًا بإرسال معلومات حساسة إلى مستودع لا يحتاج إليه كل جهاز وخادم تطوير.
أنا شخصياً أفضل الالتزام بملف .env
بإعدادات التطوير فقط. وهذا يجعل من السهل على المطورين الآخرين البدء في المشروع دون المساس ببيانات الاعتماد الخاصة بالبيئات الأخرى. إذا اتبعت هذه النصيحة، فتأكد من أن جميع بيانات الاعتماد الخاصة ببيئة التطوير الخاصة بك مختلفة عن عمليات النشر الأخرى وأن بيانات اعتماد التطوير لا يمكنها الوصول إلى أي بيانات سرية.
ENV
الموجودة؟ بشكل افتراضي، لن يقوم بالكتابة فوق متغيرات البيئة الموجودة حيث يفترض dotenv أن بيئة النشر لديها معرفة حول التكوين أكثر من التطبيق. للكتابة فوق متغيرات البيئة الموجودة، يمكنك استخدام Dotenv.load files, overwrite: true
.
يمكنك أيضًا استخدام العلامة -o
أو --overwrite
على dotenv cli للكتابة فوق متغيرات ENV
الموجودة.
$ dotenv -o -f " .env.local,.env "
إذا كنت تريد فكرة أفضل عن كيفية عمل dotenv، فاطلع على قراءة كود Ruby Rogues لـ dotenv.
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)