在不重新启动的情况下调试 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 依赖项。如果你想在每次请求时都这样做,那么这里有一些方法可以做到这一点:
- How to reload a gem on every request in Development mode?
- http://crypt.codemancers.com/posts/2013-10-03-rails-reloading-in-dev-mode/
因为初始化程序 运行 仅在初始化期间,所以 rails 不会 re-run 它们是有道理的。如果您依赖 monkey-patching,这里有一些解决方法
- Reload rails initializers
- https://simonecarletti.com/blog/2011/04/understanding-ruby-and-rails-lazy-load-hooks/
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 文件加载补丁。
将它们包围起来是一个好习惯:
使用此回调,补丁将在开发模式下的每个请求之前 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
请注意,如果更改路由,您仍然需要重新启动服务器。
我正在调试 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 依赖项。如果你想在每次请求时都这样做,那么这里有一些方法可以做到这一点:
- How to reload a gem on every request in Development mode?
- http://crypt.codemancers.com/posts/2013-10-03-rails-reloading-in-dev-mode/
因为初始化程序 运行 仅在初始化期间,所以 rails 不会 re-run 它们是有道理的。如果您依赖 monkey-patching,这里有一些解决方法
- Reload rails initializers
- https://simonecarletti.com/blog/2011/04/understanding-ruby-and-rails-lazy-load-hooks/
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 文件加载补丁。 将它们包围起来是一个好习惯:
使用此回调,补丁将在开发模式下的每个请求之前 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
请注意,如果更改路由,您仍然需要重新启动服务器。