繁体   English   中英

在Rails 3.1中重新加载lib文件而不重启dev服务器

[英]Reload lib files without restart dev server in Rails 3.1

我在rails中的lib文件夹中有一些模块,即:

/ LIB / MyApp的/ LIB / **

我正在开发它们,但每次我必须重新启动服务器。 我在SO上遇到了很多不同的问题,但大多数问题都不适用于rails 3.1

我目前有一个初始化器,可以做到这一点;

if Rails.env == "development"
  lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/**/*"], true) do
    Rails.application.reload_routes! # or do something better here
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end
end

if Rails.env == "development"
  lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/myapp/lib/*"], true) do
    Rails.application.reload_routes! # or do something better here
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end
end

有没有通用的方法来做到这一点? 每次都要重启服务器非常耗时!

摆脱初始化程序并在你的application.rb文件中放入以下行:

config.autoload_paths += Dir["#{config.root}/lib/**/"]

需要注意的一点是,您的模块和类名应遵循自动重载的命名约定。 例如,如果你有文件lib / myapp / cool.rb,那么cool.rb中类/模块声明的常量应如下所示:

Myapp::Cool

如果您有文件lib / myapp / lib / cool.rb并且您希望它使用Cool作为类/模块名称而不是Myapp :: Lib :: Cool,那么您的自动加载应该如下所示:

config.autoload_paths += Dir["#{config.root}/lib/myapp/lib/**/"]

只要您在devmode中运行,rails就会自动重新加载自动加载路径中的所有类/模块并遵循命名约定。

添加到application_controller.rb或您的基本控制器:

  before_filter :dev_reload if Rails.env.eql? 'development'

  def dev_reload
    # add lib files here
    ["rest_client.rb"].each do |lib_file|
      ActiveSupport::Dependencies.load_file lib_file
    end
  end

为我工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM