【问题标题】:Automatically reload rails module自动重新加载 rails 模块
【发布时间】:2011-01-08 22:10:44
【问题描述】:

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

当外部模块发生变化时,如何在 Rails 中重新加载外部模块?我尝试将其名称添加到ActiveSupport::Dependencies.unloadable_constants,但在控制台中键入reload! 后,即使我再输入一个require 'foo_module',我也无法在没有NameError: uninitialized constant foo 的情况下引用该符号。有谁知道如何让它工作?

注意:这里是one possible dup,但请注意在“答案”的 cmets 中它从未解决模块的问题。还有this question在答案中有死链接,最后this one也没有解决。

【问题讨论】:

  • 为什么在应用程序代码更改时重新加载部分应用程序代码,而不是重新启动应用程序?用例是什么?
  • 好点。这仅用于测试 - 重新启动服务器需要非常长的时间。在生产中这不适用。

标签: ruby-on-rails


【解决方案1】:

我找到了如何做到这一点:

  1. 确保FooModulelib/foo_module.rb 中。
  2. 使用require_dependency 要求lib/foo_module.rb 中的外部库。

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

【讨论】:

    【解决方案2】:

    这里有两个不同的问题。

    其中更简单的是,当您需要load 时,您使用的是require

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

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

    require 首选加载使用,这样当许多文件依赖于它们时,文件不会被多次评估。

    简短的版本是load可以用来重新加载已经被require加载的模块。


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

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

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

    【讨论】:

      【解决方案3】:

      我有时也花时间研究这个问题。

      这是我在 how to auto-reload require files in Rails 上的发现,无需重新启动服务器。

      该解决方案现在以 Ruby gem require_reloader 的形式提供。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-26
        • 1970-01-01
        • 2016-05-04
        • 2010-11-03
        • 2018-08-26
        • 2019-09-27
        • 2019-11-25
        • 1970-01-01
        相关资源
        最近更新 更多