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

Posted

技术标签:

【中文标题】如何解决 Heroku 上未初始化的常量 Rake::DSL 问题?【英文标题】:How to fix the uninitialized constant Rake::DSL problem on Heroku? 【发布时间】:2011-09-05 02:18:19 【问题描述】:

我收到类似于inthesequestions 的错误,除了我的错误发生在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 上运行良好。我该怎么办?

【问题讨论】:

您尝试过您发布的#3 answer 吗?进行这些更改后发生了什么? 【参考方案1】:

把它放在你的 Rakefile 上面需要'rake':

require 'rake/dsl_definition'

【讨论】:

谢谢。这解决了我的问题,我不知道发生了什么。 (作为一个完整的初学者,在 Windows 上使用 rails 安装程序并部署到 heroku。) 此解决方案是否适用于 Windows,因为我仍然遇到相同的错误 - 未初始化常量 Rake::DSL 我在部署到 Heroku 时遇到了错误,今天它引入了 rake 0.9.2。由于最初的问题是 0.9.0,也许 rake 版本不再是问题。将require 行添加到 rakefile(并重新提交并重新推送到 github 和 Heroku)解决了它。 @David,我正在使用带有 RailInstaller 1.2.0 中的 RoR 框架的 Windows。 你需要更新到 rake 0.9.2 才能工作。祝你好运! 执行 rake db:create 时出现此错误,“没有要加载的文件 -- rake/dsl_definition”【参考方案2】:

任何时候你改变你的 Gemfile,你需要bundle install 来更新你的锁文件(Gemfile.lock)。您在推送时遇到的错误并非特定于更改 rake 的版本。

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

注意您收到的错误消息:

您在开发中修改了您的 Gemfile,但没有将生成的快照 (Gemfile.lock) 检查到版本控制中

【讨论】:

您可能需要运行“bundle update rake”来重新生成 Gemfile.lock。【参考方案3】:

经过一番折腾,我终于解决了这个问题。我所做的简短版本,错过了许多实验,是这样的:

1) 更改 Gemfile 以指定 Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

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

所以,我的 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 任务仍在运行。

编辑:它确实运行良好,一次,然后下次我推东西时又炸了!啊。我想我现在修复了它,添加了 delayed_job gem,基于对话 Don't know how to build task jobs:work

安装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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

您的问题是由于没有删除 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 似乎在这里不起作用。如果其他人有答案,我将不胜感激。

【讨论】:

我绝不建议删除您的锁定文件。 删除您的 Gemfile.lock 将导致在每次部署到 heroku 时安装所有 gem 的所有最新版本(除非您将所有版本固定在 Gemfile 中)。

以上是关于如何解决 Heroku 上未初始化的常量 Rake::DSL 问题?的主要内容,如果未能解决你的问题,请参考以下文章

自动执行 rake 任务以在 heroku 上启动时运行?

Ubuntu rake 中止! NameError:未初始化的常量 ActionDispatch::XmlParamsParser

Ruby on Rails 和 Rake 问题:未初始化的常量 Rake::DSL

未初始化的常量Rake::DSL

如何将参数传递给使用 Heroku Scheduler 调用的 rake 任务?

Rails 4.1.4 在推送到 Heroku 时尝试连接到未初始化的 Mongo 数据库(rake assets:precompile)