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

时间:2011-05-30 22:40:03

标签: ruby-on-rails ruby-on-rails-3 heroku rake

我收到类似于in these questions的错误,除了Heroku上的错误:

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'

我的gemfile通常在Heroku上运行正常。我该怎么办?

5 个答案:

答案 0 :(得分:205)

将它放在你的Rakefile 上面 require'rake':

require 'rake/dsl_definition'

答案 1 :(得分:8)

每次更改Gemfile时,都需要bundle install来更新锁文件(Gemfile.lock)。您推送的错误并非特定于更改rake的版本。

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

请注意您收到的错误消息:

  

您已在开发中修改了Gemfile,但未将生成的快照(Gemfile.lock)检入版本控制

答案 2 :(得分:6)

我终于解决了这个问题,经过大量的讨论。我所做的简短版本,错过了许多实验,是:

1)更改Gemfile以指定Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2)根据Stack Overflow问题 Ruby on Rails and Rake problems: uninitialized constant Rake::DSL 取出我之前添加到Rakefile的hack:

所以,我的Rakefile现在又回到了我的应用程序的标准Rakefile:

# 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)更改Heroku以在Ruby 1.9.2中运行我的应用程序:

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

现在看起来很好 - 无论如何,预定的cron任务正在运行。

编辑: 运行正常,一次,然后在我推动东西时再次爆炸! Arrgh。我想我现在根据对话 Don't know how to build task jobs:work 添加了delayed_job gem来修复它。

安装delayed_job似乎不是一个很好的解决方案,但它已经有效了,我想在某些时候我想使用它,尤其是Heroku的每小时一次的cron工作(这不是足够频繁 - 我可能希望每五分钟运行一次。安装delayed_job gem之后,我必须为它进行设置,否则Heroku会抱怨丢失的delayed_jobs表:

#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

答案 3 :(得分:1)

我有一个Rails 3.0.11应用程序,它在Gemfile中指定了rake版本0.8.7以解决版本0.9.2 Rake :: DSL问题。

在我将应用程序转换为Rails 3.2.0(Heroku Cedar堆栈)之后,我遇到了一个问题,即工作人员(rake任务)崩溃了。我将“gem'rake','0.8.7'”更改为“gem'rake'”,其中捆绑了rake版本0.9.2.2。工人停止了新版本的崩溃。

答案 4 :(得分:0)

您的问题是由于未删除Gemfile.lock文件引起的,并非特定于Heroku。删除Gemfile.lock应解决此问题,但会引导您直接进入另一个问题:

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>'

不幸的是,我还没有找到解决这个问题的方法,因为将Rake降级到0.8.7似乎不适用于此。如果其他人有答案,我会非常感激。