لاحظت أنه عند إنشاء إضافة، إذا أضفت مجلد 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.
كنت أحاول تطبيق نظام الإضافات نفسه، وكانت مشكلتي أنني كنت أفعّلها لاحقًا خارج application.rb، في مُهيئ مثلاً. حينها لا تُضاف مجلد lib (وربما مجلدات أخرى) في الإضافات إلى مسار التحميل.