Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails/Bundler precompile vs lazy compile

Tags:

In the config/application.rb file in a Rails app, there's the following section of code:

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 

I'm perhaps not clear what Bundler.require is doing. I was under the impression that it required the specified sections in the Gemfile, but I'm not clear as to why Bundler.require *Rails.groups(...) causes it to precompile and Bundler.require(...) causes assets to be lazily loaded.

like image 752
Matty Avatar asked Oct 06 '11 12:10

Matty


People also ask

What does Rails assets Precompile do?

The Rails asset pipeline provides an assets:precompile rake task to allow assets to be compiled and cached up front rather than compiled every time the app boots. There are two ways you can use the asset pipeline on Heroku. Compiling assets locally. Compiling assets during slug compilation.


1 Answers

These lines don't actually change how your assets are used.

The first line,

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

only loads gems from the assets group in your development and test environment. This means that things like sass-rails and uglifier won't be available in production, which then means that you won't be able to properly compile/minify/whatever your assets on the fly in production if you're making use of those gems.

On the other hand,

Bundler.require(:default, :assets, Rails.env) 

will load the assets group in any environment, making those gems available in production to do asset compilation/minification/whatever on the fly.

So, as stated above, these lines don't actually change the behaviour of your asset pipeline - it simply means that you should use the first if you're going to precompile your assets for production, or use the second if you're going to lazily compile in production.

like image 193
BaronVonBraun Avatar answered Sep 28 '22 04:09

BaronVonBraun