自动重新加载导轨模块

我正在开发一个我在rails应用程序中包含的ruby模块。 我希望它在更改时自动重新加载。 我已经做了大量的谷歌搜索,并查看了讨论它的各种问题,但它们似乎都过时或者错了。

如何更改外部模块在rails中重新加载? 我已经尝试将其名称添加到ActiveSupport::Dependencies.unloadable_constants ,但是在我输入reload! 在控制台中,我不能再引用没有NameError: uninitialized constant foo符号NameError: uninitialized constant foo ,即使我做另一个require 'foo_module' 。 有谁知道如何使这个工作?

注意:这里有一个可能的dup ,但在“回答”的注释中注意它从未解决模块的问题。 还有这个问题在答案中有一个死链接,最后这个问题也没有解决。

我发现了如何做到这一点:

  1. 确保FooModule位于lib/foo_module.rb
  2. 使用require_dependency要求lib/foo_module.rb外部库。

这些步骤都是必需的,不需要其他步骤。

这里有两个不同的问题。

当你想要load时,更简单的是你正在使用require

  • 无论文件/模块需要多少次, require都会对文件中的代码进行一次评估。

  • load将在每次加载文件时评估文件中的代码。

require是首选加载使用,以便在许多文件依赖它们时不会多次评估文件。

简短版本是load可用于重新加载已由require加载的模块。


更复杂的问题是在更改时自动重新加载模块。

问题中列出的可能重复项之一链接到此处 。 这表明,如果模块在加载后发生了变化,那么依赖于模块的任何代码都会加上模块的条件加载。 您需要使用全局变量来跟踪文件的加载时间。

注意:这不应该在生产服务器上使用,但在开发服务器或控制台上应该没问题。

我有时也会研究这个问题。

这是关于如何在不重启服务器的情况下在Rails中自动重新加载需要文件的我的发现。

该解决方案现在可以作为Ruby gem require_reloader使用 。