Ich habe bemerkt, dass beim Erstellen eines Plugins, wenn ich einen lib-Ordner und einige Dateien in diesem Ordner hinzufüge, ich require verwenden kann, da dieser Ordner zu $LOAD_PATH hinzugefügt wird.
Zum Beispiel hat das Plugin docker_manager eine Datei unter lib/docker_manager/git_repo.rb. Wenn ich dann die Rails-Konsole mit rails c starte, kann ich require 'docker_manager/git_repo' eingeben.
Mich interessiert, wie Discourse all diese Pfade verfügbar macht.
Ich habe festgestellt, dass in der Datei /lib/plugin/instance.rb, wenn ich die Zeile 671 self.instance_eval File.read(path), path auskommentiere, require nicht mehr funktioniert. Allerdings verstehe ich nicht, wie instance_eval Verzeichnisse zur load_path hinzufügen könnte.
Viele plugin.rb-Dateien initialisieren eine Rails Engine, die dem Load Path verschiedene Elemente hinzufügt.
Wenn keine Rails Engine vorhanden ist, sehen Sie am Anfang der plugin.rb-Datei zahlreiche require_relative-Aufrufe, um dies auszugleichen.
Ich denke, das liegt daran, dass instance_eval die plugin.rb-Datei ausführt. Wird die plugin.rb nicht ausgeführt, wird die Rails Engine niemals erstellt, und die zusätzlichen Pfade werden nicht zum load_path hinzugefügt.
Ich habe versucht, dasselbe Plugin-System zu implementieren, und mein Problem war, dass ich die Plugins später aktiviert habe, außerhalb von application.rb, zum Beispiel in einem Initializer. Dann werden die lib-Verzeichnisse (und wahrscheinlich auch andere Ordner) der Plugins nicht zum Load Path hinzugefügt.