当Gemfile
Rails中有很多宝石时,启动时间非常糟糕。
但问题是我们并不总是需要加载所有宝石。
rake db:migrate
(及朋友)并不需要任何非ActiveRecord相关的内容(可能不是偶数)。rails c
可能需要大部分内容。rake assets:precompile
可能根本不需要太多。不幸的是initializers
与gems绑定得非常紧密(例如,当需要simple_form时,应该执行simple_form配置,因此会使gem 'simple_form', require: false
失效)。
所以问题是懒惰地执行所有初始化程序以改善启动时间的最佳方法是什么,但仍然没有破坏任何东西。
答案 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'组一样。