`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 中。

3 个赞

谢谢!这帮助我理解了。

我试图实现相同的插件系统,我的问题是我在 application.rb 之外(例如在初始化器中)较晚地激活它们。这样,插件的 lib(可能还有其他文件夹)就不会被添加到加载路径中。

2 个赞