如何修复 Heroku 上未初始化的常量 Rake: : DSL 问题?

我得到的错误类似于那些 进去 这些 问题,除了我的是发生在 你好:

2011-05-30T09:03:29+00:00 heroku[worker.1]: Starting process with command: `rake jobs:work`
2011-05-30T09:03:30+00:00 app[worker.1]: (in /app)
2011-05-30T09:03:30+00:00 heroku[worker.1]: State changed from starting to up
2011-05-30T09:03:33+00:00 app[worker.1]: rake aborted!
2011-05-30T09:03:33+00:00 app[worker.1]: uninitialized constant Rake::DSL
2011-05-30T09:03:33+00:00 app[worker.1]: /app/.bundle/gems/ruby/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:8:in `<class:TaskLib>'

这些问题的答案似乎是指定 gem 'rake', '0.8.7',因为0.9版本会导致问题。

当我试图将 gem 'rake', '0.8.7'添加到 gemfile 并将其推送到 Heroku 时,我得到了这个错误:

Unresolved dependencies detected; Installing...
You have modified your Gemfile in development but did not check
the resulting snapshot (Gemfile.lock) into version control


You have added to the Gemfile:
* rake (= 0.8.7)
FAILED: http://devcenter.heroku.com/articles/bundler
! Heroku push rejected, failed to install gems via Bundler
error: hooks/pre-receive exited with error code 1
To git@heroku.com:my_app.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:my_app.git'

我的宝石锉刀在 Heroku 上正常工作,我该怎么办?

45128 次浏览

Your problem is caused by not deleting the Gemfile.lock file and is not specific to Heroku. Deleting Gemfile.lock should fix this problem, but will lead you straight to another one:

To git@heroku.com:tailored-landing-pages.git
* [new branch]      master -> master
manfred@painstation2:~/Desktop/projects/ror/ta/tlp307$ heroku rake db:migrate
rake aborted!
ninitialized constant Rake::DSL
/app/Rakefile:13:in `<class:Application>'
/app/Rakefile:12:in `<module:Tlp307>'
/app/Rakefile:11:in `<top (required)>'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2373:in `load'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:1991:in `run'
/usr/ruby1.9.2/bin/rake:31:in `<main>'

Unfortunately, I haven't found the solution for that problem yet, since downgrading Rake to 0.8.7 doesn't seem to work here. If somebody else has an answer, I would appreciate it very much.

I solved this, finally, after a lot of mucking about. The short version of what I did, missing out the many experiments, was this:

1) change the Gemfile to specify Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2) Take out a hack that I had previously added to Rakefile based on Stack Overflow question Ruby on Rails and Rake problems: uninitialized constant Rake::DSL:

So, my Rakefile is now back to being the standard Rakefile for my app:

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
require 'rake'


MyApp::Application.load_tasks

3) Change Heroku to run my app in Ruby 1.9.2:

heroku stack:migrate bamboo-mri-1.9.2 --app myapp
git push heroku master

And it seems fine now - the scheduled cron task is running anyway.

EDIT: It did run fine, once, then blew up again next time I pushed something! Arrgh. I think I fixed it now, with the addition of the delayed_job gem, based on the conversation Don't know how to build task jobs:work.

Installing delayed_job doesn't seem like a great solution, but it HAS worked, and I might want to use it sometime I guess, especially with Heroku's once-per-hour cron job (which just isn't frequent enough - there are things I'll probably want to run every five minutes). After I installed the delayed_job gem I had to do the setup for it, otherwise Heroku complains about the missing delayed_jobs table:

#add to gemfile
gem 'delayed_job'


#at command line
bundle install
rails g delayed_job
rake db:migrate
git add -A
git commit -a -m "added delayed_job gem"
git push
heroku rake db:migrate --app myapp
heroku restart --app myapp

Put this in your Rakefile above require 'rake':

require 'rake/dsl_definition'

Any time you change your Gemfile, you need to bundle install to update your lockfile (Gemfile.lock). The error you're getting on push is not specific to changing the version of rake.

bundle install
git commit -a -m "update lockfile"
git push heroku master

Note the error message you received:

You have modified your Gemfile in development but did not check the resulting snapshot (Gemfile.lock) into version control

I had a Rails 3.0.11 app, which specified rake version 0.8.7 in the Gemfile to get around the version 0.9.2 Rake::DSL problem.

After I converted the app to Rails 3.2.0 (Heroku Cedar stack), I was having a problem with the worker (a rake task) crashing. I changed "gem 'rake', '0.8.7'" to "gem 'rake'", which bundled rake version 0.9.2.2. The worker stopped crashing with the new version.