Today I wanted to make a minimal environment for running rake tasks,
background jobs, scripts with script/runner and so on.
I started with this "config/environments/rake.rb" file:

    config.frameworks = [ :active_record ]
    config.cache_classes = true
    config.gems.shift # removes Haml, the first gem dependency in
environment.rb
    config.plugins = [ :masochism, :will_paginate, :validates_existence ]

As you can see, I'm loading only ActiveRecord and gems/plugins that go with
it.
But, I had a number of problems with this.

First, the environment-specific configuration files ("environments/ENV.rb")
are being loaded after the frameworks have been loaded. I don't know why is
this, except for the fact that `require_frameworks` method from
Rails::Initializer uses `silence_warnings` from ActiveSupport. So, my
`config.frameworks` override was useless.

Solution: I moved the `require_frameworks`call to the start of
`Initializer#process`. Of course, `silence_warnings` is not defined by that
time so I defined a no-op method on Initializer with the same name.

Second, Initializer wants to `load_application_classes` -- in other
words, preload
everything in the app/ directory (for thread-safety). This is a disaster,
because ActionMailer and ActionController are not loaded.

Solution: add a special-case to prevent it, like

    def load_application_classes
      super unless Rails.env.rake?
    end

I probably could have just said `config.cache_classes = false` instead.
Rails then assumes this is a development environment and doesn't preload.

To conclude, this was all solved by subclassing Rails::Initializer, but I
think Rails should support this out of the box. I propose the following:

   1. A tweak I described to solve my first problem;
   2. A configuration entry that specifies whether the environment should be
   in thread-safe mode. If not, don't bother with preloading, connection pools
   in ActiveRecord and such.

Thoughts?

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to