自动重新加载Rails模块

3
我正在开发一个Ruby模块并将其包含在我的Rails应用程序中。我希望它在更改后能够自动重新加载。我进行了广泛的搜索,并查看了这里讨论此问题的各种问题,但它们似乎都已过时或错误。
当外部模块更改时,如何在Rails中重新加载它?我尝试将其名称添加到ActiveSupport :: Dependencies.unloadable_constants中,但是在我在控制台中键入reload!之后,即使我再次执行require 'foo_module',我也无法引用该符号,而出现NameError:uninitialized constant foo。有人知道如何使它工作吗?
注意:这里有一个可能的重复问题,但请注意“答案”的评论中从未解决模块的问题。还有这个问题的答案中有一个失效的链接,最后还有这个问题,也没有解决它。

为什么在应用程序代码更改时重新加载部分代码而不是重启应用程序?这有什么用例吗? - tfwright
好的,这只是为了测试 - 重新启动服务器需要非常长的时间,这一点很让人沮丧。在生产环境中,这并不适用。 - Peter
3个回答

5
我找到了如何做到这一点:
  1. 确保FooModulelib/foo_module.rb中。
  2. 使用require_dependencylib/foo_module.rb中引入您的外部库。
这两个步骤都是必需的,不需要其他步骤。

1

这里有两个不同的问题。

其中较简单的是,您正在使用 require,而您需要使用 load

  • require 将对文件中的代码进行一次评估,无论该文件/模块被要求多少次。

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

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

简而言之,load 可用于重新加载已由 require 加载的模块。


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

问题中列出的可能重复链接之一指向这里。它建议为依赖于您的模块的任何代码添加前缀,如果自加载以来发生了更改,则加载您的模块的条件。您需要使用全局变量来跟踪文件加载的时间。

N.B.:不应在生产服务器上使用此功能,但在开发服务器或控制台上使用无妨。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接