Nic*_*ume 58 ruby-on-rails reload rails-engines ruby-on-rails-3
我正在为rails 3应用程序创建一个新引擎.您可以猜到,此引擎位于我的应用程序的lib目录中.
但是,我在开发它时遇到了一些问题.实际上,每次我更改引擎中的内容时,我都需要重新启动服务器.
有办法避免这种情况吗?
我可以强制rails完全重新加载lib目录或特定文件以及他对每个请求的要求吗?
谢谢你的帮助 :)
Pat*_*gan 49
我无法获得上述任何功能,因此我在Rails代码中挖了一下并想出了这个:
新文件: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
# For Rails 5.1+
ActiveSupport::Reloader.to_prepare do
lib_reloader.execute_if_updated
end
# For Rails pre-5.1
ActionDispatch::Callbacks.to_prepare do
lib_reloader.execute_if_updated
end
end
Run Code Online (Sandbox Code Playgroud)
是的,我知道这很恶心,但这是一个黑客.可能有更好的方法来触发完全重新加载,但这对我有用.我的具体用例是安装在Rails路由上的Rack应用程序,所以我需要它在我开发时进行重新加载.
基本上它的作用是检查/ lib中的任何文件是否自上次加载后发生了变化(修改后的时间戳),然后在它们发生变化时触发重新加载.
我可能还会提到我在config/application.rb中有这个
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Run Code Online (Sandbox Code Playgroud)
默认情况下,确保我的lib目录中的所有内容都被加载.
Yays!
shi*_*ime 33
TL; DR
把它放在config/application.rb中
config.eager_load_paths += ["#{Rails.root}/lib"]
删除lib文件的require语句
走!
让我详细解释一下.
我不知道为什么这个答案被接受,因为它无助于在每个请求上重新加载lib文件夹.首先我认为它适用于Rails 2,但问题清楚地表明它适用于Rails 3,发布日期3.0.0是在答案日期之前.
其他答案似乎过于复杂或无法提供真正的解决方案.
我决定稍微调查一下,因为它困扰着我,我甚至发现人们有一个解决方法,它涉及将lib文件保存app/models在开发中,然后/lib在完成后移动它.我们可以做得更好,对吗?
我的解决方案经过测试:
把它放到你的config/application.rb:
# in config/application.rb
config.eager_load_paths += ["#{Rails.root}/lib"]
Run Code Online (Sandbox Code Playgroud)
就是这样!™
请确保将其放在此处,因为如果将其放入,它将无法工作config/environments/development.rb.
确保删除代码的所有require语句,/lib因为require语句也会导致此解决方案无效.
这段代码隐含地需要你的代码,所以如果你做环境检查(这是不必要的)而不是上面的代码,你决定写这样的东西:
# in config/application.rb
config.eager_load_paths += ["#{Rails.root}/lib"] if Rails.env.development?
Run Code Online (Sandbox Code Playgroud)
您应该注意旧require语句,因为在这种情况下,它们仍然需要在所有非开发环境中使用.
因此,如果您仍然决定进行环境检查,请确保对require语句进行反向检查.否则你会被咬伤!
require "beer_creator" unless Rails.env.development?
Run Code Online (Sandbox Code Playgroud)
您可能认为编写关于不必要的内容的整个段落也是不必要的,但我认为警告人们在做一些不必要的事情时所需要的东西也是必要的.
如果您想了解有关此主题的更多信息,请查看此小教程.
小智 13
你必须添加
config.autoload_paths += %W(#{config.root}/lib)
Run Code Online (Sandbox Code Playgroud)
到config/application.rb中的Application类
https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib
| 归档时间: |
|
| 查看次数: |
23876 次 |
| 最近记录: |