Wie der `lib`-Ordner von Plugins zum `$LOAD_PATH` hinzugefügt wird

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.

3 „Gefällt mir“

Danke! Das hat mir geholfen, es zu verstehen.

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.

2 „Gefällt mir“