プラグインの `lib` フォルダが `$LOAD_PATH` に追加される方法

プラグインを作成する際、lib フォルダとその中にいくつかのファイルを追加すると、それが $LOAD_PATH に追加されるため require が使えることに気づきました。

例えば、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 Engine を初期化し、ロードパスにさまざまなものを追加します。

Rails Engine が存在しない場合、それを補うために plugin.rb ファイルの冒頭に多数の require_relative 呼び出しが表示されます。

これは、instance_evalplugin.rb ファイルを実行しているためだと考えられます。plugin.rb が実行されない場合、Rails Engine は作成されず、追加のパスが load_path に追加されません。

「いいね!」 3

ありがとうございます!おかげで理解できました。

私も同じプラグインシステムを実装しようとしていたのですが、問題は application.rb の外側、例えばイニシャライザーなどでプラグインを遅れてアクティブ化していたことです。その場合、プラグインの lib(おそらく他のフォルダも)がロードパスに追加されません。

「いいね!」 2