我已经构建了一个rails插件,并且它需要构建一些文件才能正常工作。用户可以将其作为rake任务手动启动,但为了方便开发,我希望在刷新浏览器时添加重新运行此版本的选项。在重新加载Rails插件时运行任意代码
为了清楚起见,我不想每次刷新重新加载插件,也不想重新加载其他任何ruby文件。每次Rails决定重新加载它的库时,我都想运行一些任意的ruby代码。
我已经构建了一个rails插件,并且它需要构建一些文件才能正常工作。用户可以将其作为rake任务手动启动,但为了方便开发,我希望在刷新浏览器时添加重新运行此版本的选项。在重新加载Rails插件时运行任意代码
为了清楚起见,我不想每次刷新重新加载插件,也不想重新加载其他任何ruby文件。每次Rails决定重新加载它的库时,我都想运行一些任意的ruby代码。
我遇到了这个解决方案,这有点更重要。
ActionDispatch::Callbacks.to_prepare do
Rails.logger.warn "Look at me I'm updating!"
end
解决方案一:
您必须添加:
config.autoload_paths += %W(#{config.root}/lib)
在配置应用程序类/ application.rb中
请参考以下链接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
这是令人厌恶的,但它是一个黑客。可能有更好的方法来触发完整的重新加载,但这对我很有用。我的具体用例是一个Rack应用程序安装到Rails路线,因此我需要它在开发过程中重新加载。
基本上它会检查/lib
中的任何文件是否自上次加载后发生更改(修改时间戳),然后在更改时触发重新加载。
我也可能会提到我有这个在我的config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
刚刚默认情况下,让我在lib目录确保一切都被加载。
对我来说第二个解决方案工作 – 2013-04-25 08:16:06
没错。自动加载正在重新加载文件,我不必在那里只放入类,我可以放入立即执行的代码。这对我来说非常愚蠢。我喜欢前者,因为它会将其留在轨道上以找出何时在没有条件的情况下运行代码。谢谢! – trevorgrayson 2013-04-25 12:57:33
@rovertus,谢谢! – 2013-04-25 13:08:05