0

我已经构建了一个 rails 插件,它需要构建一些文件才能正常工作。用户可以手动将其作为 rake 任务启动,但为了方便开发,我想添加在刷新浏览器时重新运行此构建的选项。

为了清楚起见,我不想每次刷新都重新加载插件,也不想重新加载任何其他 ruby​​ 文件。每次 Rails 决定重新加载它的库时,我都想运行一些任意的 ruby​​ 代码。

4

2 回答 2

2

第一个解决方案:

您必须添加:

config.autoload_paths += %W(#{config.root}/lib) 

在 config/application.rb 的 Application 类中

请参考此链接https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib

另一个:

试一试比较有用,

新文件:config/initializers/reload_lib.rb

if Rails.env == "development"
  lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/**/*"]) do
    Rails.application.reload_routes! # or do something better here
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end
end

这很恶心,但它是一个黑客。可能有更好的方法来触发完全重新加载,但这对我有用。我的具体用例是安装在 Rails 路由上的 Rack 应用程序,因此我需要在开发过程中重新加载它。

基本上它的作用是检查/lib自上次加载以来是否有任何文件已更改(修改的时间戳),然后如果它们更改则触发重新加载。

我也可能会提到我在我的config/application.rb

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

默认情况下,它确保我的 lib 目录中的所有内容都被加载。

于 2013-04-25T08:15:09.493 回答
0

我遇到了这个更重要的解决方案。

ActionDispatch::Callbacks.to_prepare do
  Rails.logger.warn "Look at me I'm updating!"
end 
于 2013-04-29T00:00:19.840 回答