【问题标题】:How to execute initializers lazily?如何懒惰地执行初始化程序?
【发布时间】:2012-10-08 01:52:48
【问题描述】:
当Gemfile 中有很多 gem 时,Rails 的启动时间非常糟糕。
但问题是我们并不总是需要加载所有的 gem。
-
rake db:migrate(和朋友)真的不需要任何与 ActiveRecord 无关的东西(甚至可能不需要)。
- 另一方面,
rails c 可能需要大部分内容。
-
rake assets:precompile 可能根本不需要太多。
- 等
不幸的是,initializers 与 gems 绑定得非常紧密(例如,当需要 simple_form 时应该进行 simple_form 配置,因此 gem 'simple_form', require: false 会失败)。
所以问题是懒惰地执行所有初始化程序以缩短启动时间,但仍然不会破坏任何东西的最佳方法是什么。
【问题讨论】:
标签:
ruby-on-rails
ruby
ruby-on-rails-3
gem
lazy-loading
【解决方案1】:
您可以完全控制 Bundler 在启动时加载的 gem。在您的 application.rb 中,您会发现以下内容:
if defined?(Bundler)
Bundler.require *Rails.groups(:assets => %w(development test))
end
您可以稍微修改它以对 ENV 变量做出反应,以便告诉捆绑程序加载您的 gem 的简化子集。
if defined?(Bundler)
if ENV['RAKE_ENV']
Bundler.require :rake
else
Bundler.require *Rails.groups(:assets => %w(development test))
end
end
现在,您可以通过检查是否设置了环境变量来切换初始化程序。
在您的 Gemfile 中,您必须创建一个名为“rake”的组,与创建“开发”和“测试”组的方式相同。