実行環境とBundler.require
Gemfile
source 'http://rubygems.org' gem 'rails', '3.1.1' group :assets do gem 'sass-rails', '~> 3.1.4' gem 'coffee-rails', '~> 3.1.1' gem 'uglifier', '>= 1.0.3' end gem 'jquery-rails' group :development, :test do gem 'turn', :require => false end group :production do gem 'therubyracer' end
以上のようなGemfileがあった場合、Bundler.requireによって次のような結果が得られる。
Bundler.require(:default) #=> rails, jquery-rails Bundler.require(:default, :assets) #=> rails, jquery-rails, sass-rails, coffee-rails, uglifier Bundler.require(:default, :assets, :development) #=> rails, jquery-rails, sass-rails, coffee-rails, uglifier, turn Bundler.require(*Rails.groups(:assets => %w(development test))) #=> Bundler.require(:default, :development, :assets) # for Rails.env == 'development' #=> rails, jquery-rails, sass-rails, coffee-rails, uglifier, turn #=> Bundler.require(:default, :production) # for Rails.env == 'production' #=> rails, jquery-rails, therubyracer
Bundler.requireの仕様を理解していれば、config/application.rbのコメントの説明も理解できるだろう。
config/application.rb
if defined?(Bundler) # If you precompile assets before deploying to production, use this line Bundler.require(*Rails.groups(:assets => %w(development test))) # If you want your assets lazily compiled in production use this line # Bundler.require(:default, :assets, Rails.env) end
production環境でaseetsをどのタイミングでプリコンパイルするかで、この設定を変更する必要があるようだ。
Bundler.require(*Rails.groups(:assets => %w(development test))) #=> production環境では:assetsはロードされないので、デプロイ前に手動でプリコンパイルしておく必要がある Bundler.require(:default, :assets, Rails.env) #=> production環境でも:assetsをロードするので、自動でプリコンパイルしてくれる