Strange rake error with config.cache_classes

when i run rake tasks, i run into a strange problem when running it in
production mode. it loads all of the files in the directory app/
runners/cron. when i run the rake task with config.cache_classes set
to true (as it is set in environment/production.rb) then it seems to
load those files in that directory upon execution of the rake command.
however, those files are not loaded when it is set to false.

i have checked my application, boot, and environment files and i am
not loading that directory.

i came across this error trying to run a thinking_sphinx rake task as
below:

http://groups.google.com/group/thinking-sphinx/browse_thread/thread/b35782f90d7605fa

On Mon, Jan 31, 2011 at 3:48 AM, tashfeen.ekram
[email protected] wrote:

when i run rake tasks, i run into a strange problem when running it in
production mode. it loads all of the files in the directory app/
runners/cron. when i run the rake task with config.cache_classes set
to true (as it is set in environment/production.rb) then it seems to
load those files in that directory upon execution of the rake command.
however, those files are not loaded when it is set to false.

i have checked my application, boot, and environment files and i am
not loading that directory.

Can you reproduce it in a minimal application?

I see from the other thread that the application runs Rails 3. Just in
case it was migrated from Rails 2 let me comment that in Rails 2
custom directories under app are not eager loaded, while they are in
Rails 3. In case it rings a bell.

Having said that, eager loading is not triggered for bare rake tasks
that do not depend on the builtin :environment task. And for tasks
that do depend there’s a global flag called $rails_rake_task set to
true within :environment that prevents eager loading from being run at
all. Thus, as far as rake tasks is concerned, it shouldn’t happen in
any case
unless there’s some custom behavior somewhere.

So, based on what you are saying, these must be loaded somehow from a
custom load that I added?

The thing I find confusing though is that should not the same thing
happen even if classes are not cached?

Are there any other files I should look at to track down where this
include might be coming from?

Finally, where is the ideal place to put custom files?

Thanks for you help. :slight_smile:

On 31 Jan 2011, at 19:46, “tashfeen.ekram” [email protected]
wrote:

So, based on what you are saying, these must be loaded somehow from a
custom load that I added?

The thing I find confusing though is that should not the same thing
happen even if classes are not cached?

class_caching is the thing that triggers whether application classes
should be automatically loaded.

Are there any other files I should look at to track down where this
include might be coming from?

I’d double check nothing is playing with eager_load_paths (which is
those paths to be loaded ahead of time)

Fred

is there a way to output the eager_load_path?

i added the following line to one of the files that is mistakely
loaded:

puts @eager_load_paths

However, the output is nil. does this mean nothing is being eagerly
loaded?

On Feb 1, 2:36am, Frederick C. [email protected]

Oh, will get back to you on whether this can be reproduced on a
minimal app…

I am still struggling with this. Any idea how I can figure out load
paths?

Also, when I run the below rkae command that is run in the production
environment I do not get the same error.

rake db:migrate RAILS_ENV=production

Should the above command also be caching the classes and cause me to
surface the same problem?

finally figured it out. it is a features of rails 3.0.

“config.eager_load_paths accepts an array of paths from which Rails
will eager load on boot if cache classes is enabled. Defaults to every
folder in the app directory of the application. All elements of this
array must also be in load_paths.”

On Sat, Feb 5, 2011 at 8:39 PM, tashfeen.ekram
[email protected] wrote:

finally figured it out. it is a features of rails 3.0.

Configuring Rails Applications — Ruby on Rails Guides

“config.eager_load_paths accepts an array of paths from which Rails
will eager load on boot if cache classes is enabled. Defaults to every
folder in the app directory of the application. All elements of this
array must also be in load_paths.”

Yes, I commented it above.

But eager loading does NOT happen on rake tasks no matter the
environment.

Ahhh. Now, I understand your comment but this also confuses me.

  1. rake thinking_sphinx:configure
    no prob

  2. rake thinking_sphinx:configure RAILS_ENV=production
    problem

  3. rake db:migrate
    no prob

  4. rake db:migrate RAILS_ENV=production
    no prob

I guess I am confused why the same problem would not surface when
running command 4. Also, I can run command 2 and change in
environments/production.rb cache_classes to false (rather than the
default of true) and then the problem goes away.

It seems like changing cache_classes should not change rake behavior??
Or is there some condition in the rest of the app that is including it
based on whether classes are or not cached?

I created a basic app with nothing else except a gem file and those
files being loaded in the “app/runners/cron” directory and it does
appear to reproduce the error.

On Sat, Feb 5, 2011 at 11:32 PM, tashfeen.ekram
[email protected] wrote:

  1. rake db:migrate RAILS_ENV=production
    no prob

I guess I am confused why the same problem would not surface when
running command 4.

If you define a rake task that depends on the :environment builtin
task no eager loading is triggered.

Also, I can run command 2 and change in
environments/production.rb cache_classes to false (rather than the
default of true) and then the problem goes away.

Because cache_classes is a necessary condition for eager loading. If
you set cache_classes to false no eager loading will happen (unless
forced of course).

But it is not a sufficient condition: even if cache_classes is true,
db:migrate and friends won’t trigger eager loading.

Could you come up with a self-contained minimal application that
reproduces the issue? Eg, an application with one exact model and one
exact file in app/runners/cron or whatever and the plugin installed
under vendor. Put

puts "loading #{__FILE__}"

at the top of each of them. Then two one-liners that demonstrate the
problem.

If you upload a tarball with that I’ll have a look at it.

I’ve run into a similar issue where a variable contained nil when it
should always be an array (the controller ensures this, the view is
where the error was raised.)

Anyways, setting “config.eager_load_paths = false” appears to fix the
issue which only occurs when “config.cache_classes = true”. It seems
eager loading has to do with using :include in a find query, taking out
all such includes fixed the problem for me.