调试Rails应用程序而不重新启动

时间:2017-02-02 16:07:22

标签: ruby-on-rails ruby ruby-on-rails-4 redmine webrick

我正在调试rails app(Redmine),每次我在插件的路由或库中更改某些补丁基类时,我必须重新启动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

是否有人知道强行应用程序部分重新加载受影响或有此类更改的类的方法?

3 个答案:

答案 0 :(得分:2)

您可能从Redmine插件的init.rb文件中加载了补丁。 用它们包围它们是一个很好的做法:

  

ActionDispatch::Reloader.to_prepare

使用此回调,将在开发模式中的每个请求之前重新应用修补程序。

以下是一个例子:

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

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

答案 1 :(得分:1)

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

由于初始化程序仅在初始化期间运行,因此rails不会重新运行它们。如果您依赖猴子修补,可以使用此处描述的方法

答案 2 :(得分:1)

Redmine插件通常不是Ruby宝石,而是存在于主Rails应用程序内的文件夹中。

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

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

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

实际上,由于违反了这些规则,许多Redmine插件会破坏自动加载。尝试重新加载时,症状可能不是自动重新加载,甚至是应用程序错误,导致应用程序在生产模式下正常工作,但在开发模式下第一次成功请求后失败。

通常只需重新组织插件代码以匹配Rails'只需要预测和删除需求语句就可以解决这类问题。

更改插件声明的路由将需要重新启动服务器,我不知道如何使用Redmine自动重新加载这些路由。