実行環境と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をロードするので、自動でプリコンパイルしてくれる