我已经构建了一个 rails 插件,它需要构建一些文件才能正常工作。用户可以手动将其作为 rake 任务启动,但为了方便开发,我想添加在刷新浏览器时重新运行此构建的选项。
为了清楚起见,我不想每次刷新都重新加载插件,也不想重新加载任何其他 ruby 文件。每次 Rails 决定重新加载它的库时,我都想运行一些任意的 ruby 代码。
我已经构建了一个 rails 插件,它需要构建一些文件才能正常工作。用户可以手动将其作为 rake 任务启动,但为了方便开发,我想添加在刷新浏览器时重新运行此构建的选项。
为了清楚起见,我不想每次刷新都重新加载插件,也不想重新加载任何其他 ruby 文件。每次 Rails 决定重新加载它的库时,我都想运行一些任意的 ruby 代码。
第一个解决方案:
您必须添加:
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 目录中的所有内容都被加载。
我遇到了这个更重要的解决方案。
ActionDispatch::Callbacks.to_prepare do
Rails.logger.warn "Look at me I'm updating!"
end