我正在开发一个我在rails应用程序中包含的ruby模块。我希望它在更改时自动重新加载。我已经做了大量的谷歌搜索,并查看了讨论它的各种问题,但它们似乎都过时或错误。
如何更改外部模块在rails中重新加载?我已尝试将其名称添加到ActiveSupport::Dependencies.unloadable_constants
,但在我在控制台中输入reload!
后,即使我执行另一个NameError: uninitialized constant foo
,我也无法再引用该符号require 'foo_module'
1}}。有谁知道如何使这个工作?
注意:这里是one possible dup,但请注意“答案”的注释,它从未解决过模块的问题。还有this question在答案中有一个死链接,最后this one,它也没有解决它。
答案 0 :(得分:5)
我发现了如何做到这一点:
FooModule
位于lib/foo_module.rb
。require_dependency
在lib/foo_module.rb
。{/ li>中要求使用外部库
醇>
这些步骤都是必需的,不需要其他步骤。
答案 1 :(得分:1)
这里有两个不同的问题。
当您需要require
时,更简单的是使用load
。
require
将评估文件中的代码一次,无论该文件/模块需要多少次。
load
将在每次加载文件时评估文件中的代码。
require
首选加载使用,以便在许多文件依赖它们时不会多次评估文件。
简短版本是load
可用于重新加载已由require
加载的模块。
更复杂的问题是在更改时自动重新加载模块。
问题中列出的一个可能的重复项链接到here。如果自加载以来已经更改,那么建议将依赖于模块的任何代码加上模块的条件加载前缀。您需要使用全局变量来跟踪文件的加载时间。
N.B。:这不应该在生产服务器上使用,但在开发服务器或控制台上应该没问题。
答案 2 :(得分:0)
我有时也会研究这个问题。
这是我在how to auto-reload require files in Rails没有重启服务器的调查结果。
该解决方案现在可以作为Ruby gem require_reloader使用。