如何懒惰地执行初始化程序?

时间:2012-10-08 01:52:48

标签: ruby-on-rails ruby ruby-on-rails-3 gem lazy-loading

Gemfile Rails中有很多宝石时,启动时间非常糟糕。

但问题是我们并不总是需要加载所有宝石。

  • rake db:migrate(及朋友)并不需要任何非ActiveRecord相关的内容(可能不是偶数)。
  • 另一方面,rails c可能需要大部分内容。
  • rake assets:precompile可能根本不需要太多。

不幸的是initializers与gems绑定得非常紧密(例如,当需要simple_form时,应该执行simple_form配置,因此会使gem 'simple_form', require: false失效)。

所以问题是懒惰地执行所有初始化程序以改善启动时间的最佳方法是什么,但仍然没有破坏任何东西。

1 个答案:

答案 0 :(得分:2)

您可以完全控制Bundler在启动时加载的gem。在您的application.rb中,您将找到以下内容:

if defined?(Bundler)
  Bundler.require *Rails.groups(:assets => %w(development test))
end

您可以稍微修改它以对ENV变量作出反应,以告诉捆绑者加载您宝石的简化子集。

if defined?(Bundler)
  if ENV['RAKE_ENV']
    Bundler.require :rake
  else
    Bundler.require *Rails.groups(:assets => %w(development test))
  end
end

现在,您可以通过检查环境变量是否已设置来切换初始化程序。

在你的Gemfile中,你必须创建一个名为'rake'的组,就像你创建'development'和'test'组一样。