Как папка `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 Engine, который добавляет в путь загрузки различные компоненты.

Когда у нас нет Rails Engine, в начале файла plugin.rb вы увидите множество вызовов require_relative для компенсации этого.

Я думаю, это происходит потому, что instance_eval выполняет файл plugin.rb. Если файл plugin.rb не выполняется, Rails Engine никогда не создается, и дополнительные пути не добавляются в load_path.

Спасибо! Это помогло мне разобраться.

Я пытался реализовать ту же систему плагинов, и моей проблемой было то, что я активировал их позже, вне application.rb, например, в инициализаторе. В результате папка lib (и, вероятно, другие папки) плагинов не добавлялась в путь загрузки.