在不重新启动的情况下调试 Rails 个应用程序

Debugging Rails application without restarting

我正在调试 rails 应用程序 (Redmine),每次我在插件的路由或库中更改一些补丁基础 class 我必须重新启动 rails 服务器,即使它的在开发模式下缓存关闭等..

这是我的服务器的样子:

rails s
=> Booting WEBrick
=> Rails 3.2.16 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2017-02-02 17:06:18] INFO  WEBrick 1.3.1
[2017-02-02 17:06:18] INFO  ruby 2.1.8 (2015-12-16) [x86_64-darwin15.0]
[2017-02-02 17:06:18] INFO  WEBrick::HTTPServer#start: pid=12042 port=3000

有谁知道强制应用程序部分重新加载受影响或有此类更改的 classes 的方法吗?

启动过程在 rails 中需要相当长的时间。大部分时间是由于加载 gem 依赖项。如果你想在每次请求时都这样做,那么这里有一些方法可以做到这一点:

因为初始化程序 运行 仅在初始化期间,所以 rails 不会 re-run 它们是有道理的。如果您依赖 monkey-patching,这里有一些解决方法

Redmine 插件通常不是 Ruby gem,而是位于主 Rails 应用程序内的一个文件夹中。

只要插件作者遵循一些 Rails 最佳实践,Rails' 自动加载应该(并且将会)也适用于 Redmine 插件。基本要注意的事情是:

  • 正确的命名和命名空间 - 具有与模块对应的子目录和与它们声明的 class / 模块对应的文件名,即 Foo::Bar::Baz 位于 lib/foo/bar/baz.rb
  • 从不手动要求内容,但让 Rails 自动加载所有内容
  • 在自动重新加载
  • 期间,请注意何时何地打补丁以打补丁re-applied

如果插件作者遵循这些规则,插件的代码很可能会自动加载和重新加载。一个例外是插件的 init.rb,但这在插件开发过程中通常不会经常更改。

实际上,许多 Redmine 插件由于违反这些规则而导致自动加载中断。症状可能是没有自动重新加载,甚至在尝试重新加载时出现应用程序错误,导致应用程序在生产模式下运行良好,但在开发模式下第一次成功请求后失败。

通常只需 re-organizing 匹配 Rails 期望的插件代码并删除 require 语句就可以解决此类问题。

更改插件声明的路由仍然需要重新启动服务器,我不知道有什么方法可以让 Redmine 自动重新加载这些路由。

您可能从 Redmine 插件的 init.rb 文件加载补丁。 将它们包围起来是一个好习惯:

ActionDispatch::Reloader.to_prepare

使用此回调,补丁将在开发模式下的每个请求之前 re-applied。

这是一个例子:

require 'redmine'
ActionDispatch::Reloader.to_prepare do
  require_dependency 'redmine_multiprojects_issue/issue_patch'
  require_dependency 'redmine_multiprojects_issue/issues_helper_patch'
  require_dependency 'redmine_multiprojects_issue/issues_controller_patch'
end
Redmine::Plugin.register :redmine_multiprojects_issue do
  ...
end

请注意,如果更改路由,您仍然需要重新启动服务器。