كيف تتم إضافة مجلد `lib` الخاص بالإضافات إلى `$LOAD_PATH`

لاحظت أنه عند إنشاء إضافة، إذا أضفت مجلد lib وبعض الملفات داخل هذا المجلد، فيمكنني استخدام require لأنه يُضاف إلى $LOAD_PATH.

على سبيل المثال، تحتوي الإضافة docker_manager على ملف lib/docker_manager/git_repo.rb. وعند تشغيل وحدة تحكم Rails عبر الأمر rails c، يمكنني كتابة require 'docker_manager/git_repo'.

أنا فضولي لمعرفة كيف يجعل Discourse كل هذه المسارات متاحة؟

لاحظت أنه في الملف /lib/plugin/instance.rb، إذا قمت بتعليق السطر 671 self.instance_eval File.read(path), path، فإن أمر require لا يعمل. ومع ذلك، لا أفهم كيف يمكن لـ instance_eval أن يضيف مجلدات إلى load_path.

تقوم العديد من ملفات plugin.rb بتهيئة محرك Rails، مما يضيف عناصر مختلفة إلى مسار التحميل.

عندما لا يكون لدينا محرك Rails، ستلاحظ وجود العديد من استدعاءات require_relative في أعلى ملف plugin.rb للتعويض عن ذلك.

أعتقد أن السبب في ذلك هو أن instance_eval يقوم بتنفيذ ملف plugin.rb. وإذا لم يتم تنفيذ ملف plugin.rb، فلن يتم إنشاء محرك Rails أبدًا، ولن تُضاف المسارات الإضافية إلى load_path.

3 إعجابات

شكرًا لك! ساعدني ذلك في الفهم.

كنت أحاول تطبيق نظام الإضافات نفسه، وكانت مشكلتي أنني كنت أفعّلها لاحقًا خارج application.rb، في مُهيئ مثلاً. حينها لا تُضاف مجلد lib (وربما مجلدات أخرى) في الإضافات إلى مسار التحميل.

إعجابَين (2)