2

GemfileRails 中有很多 gem 时,启动时间就很糟糕了。

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

  • rake db:migrate和朋友)真的不需要任何与 ActiveRecord 无关的东西(甚至可能不需要)。
  • rails c另一方面,可能需要大部分。
  • rake assets:precompile可能根本不需要太多。
  • 等等。

不幸的initializers是,它们与 gem 的绑定非常紧密(例如 simple_form 配置应该在需要 simple_form 时完成,因此会失败gem 'simple_form', require: false)。

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

4

1 回答 1

2

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

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

您可以稍微修改它以对 ENV 变量做出反应,以便告诉 bundler 加载您的 gem 的简化子集。

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

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

在您的 Gemfile 中,您必须创建一个名为“rake”的组,与创建“开发”和“测试”组的方式相同。

于 2012-10-08T04:47:34.817 回答