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

Posted

技术标签:

【中文标题】Ruby on Rails 和 Rake 问题:未初始化的常量 Rake::DSL【英文标题】:Ruby on Rails and Rake problems: uninitialized constant Rake::DSL 【发布时间】:2011-08-30 10:43:39 【问题描述】:

我遇到了一个非常令人沮丧的问题:Rake 很笨。

问题是这样产生的:

$ rails new test_app
$ rails generate scaffold new_scaffold field1:string field2:text

这两个都很好,但是当我这样做时,

$ rake db:migrate

我收到以下错误。

(in /home/mikhail/test_app)
rake aborted!
uninitialized constant Rake::DSL
/usr/lib/ruby/1.9.1/rake.rb:2482:in `const_missing'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:8:in `<class:TaskLib>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:6:in `<module:Rake>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:3:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `require'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `load'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `block in <top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `each'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `initialize_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:139:in `load_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:77:in `method_missing'
/home/mikhail/test_app/Rakefile:7:in `<top (required)>'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `load'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:1991:in `run'
/usr/bin/rake:31:in `<main>'

我在 Internet 上查找了类似/相同的错误,并且人们遇到了这些错误。只是似乎没有人能解决这个问题!

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

之前的tweet from DHH。 Rake .9.0 破坏了 Rails 和其他一些东西,你需要:

gem "rake", "0.8.7"

在您的 Gemfile 中。

【讨论】:

这对我有用。我需要先做bundle update rake。然后我检查了bundle show rake。它应该说 0.8.7。然后rake db:migrate. 或者更好:gem "rake", "!= 0.9.0"。这避免了损坏的 0.9.0 版本,但是一旦发布了较新的版本,就会更新到更新版本(稍后删除它不会有坏处,但保留它也不应该有坏处)。 @Spiralis 我也遇到了版本 0.9.2 的问题。因此,您可能需要为几个版本添加该行。 这个解决方案工作对我有用。像@dharmatech 一样,我在heroku rake db:migrate 中提出了这个问题,这似乎解决了它。记得在继续之前将这些更改添加并提交到 git ;) 这可能适用于 Rails,但我还必须执行 sudo gem install rake 以确保我从命令行调用的 rake 版本不是 0.8.7。【参考方案2】:

我在上一个答案之后做了一些研究(对不起,我必须在它之前做)。

Rake gem 0.9.2 解决了所有问题。我按照以下步骤操作:

我安装了gem install rake -v=0.9.2(我有 0.9.1 gem) 删除了带有gem uninstall rake -v=0.9.1的0.9.1 更新为bundle update

然后db:migrate 显示警告,WARNING: Global access to Rake DSL methods is deprecated. Please....

通过将以下内容添加到 Rake 文件中已解决。

module ::YourApplicationName  
  class Application
    include Rake::DSL
  end
end

我省略了@databyte 建议的module ::RakeFileUtils extend Rake::FileUtilsExtend 选项。

这意味着 Rake gem 0.9.2 工作正常!

【讨论】:

按照前三个步骤,我没有收到任何警告,所以没有打扰其余的,谢谢你的建议! 这求我问...为什么我要破解 Rake 以保留该功能? Rake 想要做什么,我现在应该使用什么? @Arrumaco,Rake 文件的目录是什么? 值得注意的是,RakeFile 的添加应该在 require 'rake' 之前 - 让我失望了 :) 同样的问题,但我已经有了 rake (0.9.2, 0.8.7)。重新安装 0.9.2 似乎可以解决问题:1)gem uninstall rake -v=0.9.2 2)gem install rake -v=0.9.2【参考方案3】:

浏览 Railstutorial (demo_app) 的第 2 章并遇到这个问题。我尝试了此处列出的所有其他答案,但在我这样做之前无法让它工作:

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

require 'rake/dsl_definition'

通过How to fix the uninitialized constant Rake::DSL problem on Heroku?

我还重新提交并将所有文件推送到 Github 和 Heroku。

【讨论】:

这似乎是最好的答案,因为从 0.9.2 降级到 0.8.7 会破坏一些 gem 依赖项,具体取决于每种情况,例如我的 :) 谢谢! 它对我不起作用。执行 rake db:create 时,我得到“没有要加载的文件 -- rake/dsl_definition”【参考方案4】:

我需要做的就是使用:

gem install rake

我已经有 0.9.2 版本,只需要安装。

【讨论】:

哇,它对我有用。但是你能解释一下为什么我必须安装 rake 而我的 rake 应该已经安装了吗? 我还不是真正的专家,但我的理解是在您的 PC 上“安装”gem 和在 gem 注册表中“安装”它们之间存在差异 - 我怀疑这是因为Ruby 安装需要知道哪些 gem 在您的 PC 上。也许这在未来可以自动化,或者已经在某些 Ruby 发行版中自动化......【参考方案5】:

重新安装 rake gem,它应该可以正常工作:

gem uninstall rake -v=0.9.2 
gem install rake -v=0.9.2

如果没有,请在 Gemfile 中指定版本“0.8.7”。

【讨论】:

这种方法对我有用,我更喜欢不必降级版本.. 也为我工作,仅适用于 rake -v 0.9.2.2【参考方案6】:

如果不使用 Bundler:

sudo gem install rake -v 0.8.7
sudo gem uninstall rake

然后选择卸载0.9.0。

【讨论】:

这在没有捆绑程序的情况下为我修复了它(rails 2.3.8)。曾尝试安装 rake 0.9.2 但这并没有解决问题。安装 0.8.7 并卸载 0.9.2 最终对我有用。【参考方案7】:

如果你像我一样卡在 rake 0.8.7 上,而你使用的是 Rails 3.2.x,那么 railties 会增加对 Rake::DSL 的要求

要解决这个问题,您应该在 Rakefile 的顶部添加:

module Rake
  module DSL
  end
end

【讨论】:

【参考方案8】:

我通过以下步骤解决了同样的问题:

在 Gemfile 中:

gem 'rake', '0.9.2'

然后在控制台上运行:

sudo bundle update rake

然后在 Rakefile 中添加以下行:

require 'rake/dsl_definition'
include Rake::DSL

【讨论】:

【参考方案9】:

Rails 3.1.rc1 已更新。对于您自己的 Rakefile,您可以在调用 load_tasks 之前添加它。

module ::YourApplicationName
  class Application
    include Rake::DSL
  end
end

module ::RakeFileUtils
  extend Rake::FileUtilsExt
end

https://gist.github.com/4cd2bbe68f98f2f0249f

更新:还注意到这里也已经回答了:Undefined method 'task' using Rake 0.9.0

【讨论】:

【参考方案10】:

我遇到了同样的问题,不得不使用 rake 0.8.7 gem 而不是 0.9.0。

【讨论】:

【参考方案11】:

我是 Windows XP 用户,我遇到了同样的问题。

我在 gemfile 中输入 gem "rake", "0.8.7",然后在命令窗口中输入以下内容。

bundle update rake

这解决了我的问题。

【讨论】:

今天也为我工作。只是想在 Win7 上编写 rails 代码。【参考方案12】:
    转到您的项目路径 输入bundle install --path=vendor/bundle 输入bundle exec rake db:migrate

要启动服务器类型bundle exec rails s。使用 bundle exec ,您将确保为您的项目使用正确的 gem(必需版本)。 如果您使用git 并为bundle exec 创建别名,我还建议您将vendor/bundle 添加到.gitignore。如果您使用zsh,您可以关注this approach

【讨论】:

【参考方案13】:

与上面的 Branstar 相同 - 感谢 Branstar!

操作系统:Windows Vista 级别:Ruby on Rails 的新手 我已经安装了 Ruby 1.9.2

我按照 Running Rails 3 on Windows 中的说明进行操作。

一直到“rake db:migrate”部分给了我与原始帖子相同的输出。

我跑了:

gem install rake

我又跑了:

rake db:migrate

然后我就能够启动 Ruby on Rails 服务器并准备好一切。

再次感谢布兰斯塔 :-)

【讨论】:

【参考方案14】:

我为你 (mikhailvs) 感到难过。我已经疯了差不多一整天了。我什至卸载了 Ruby 及其所有依赖文件并关闭了我的电脑,但我仍然遇到了同样的问题。

我从错误消息中得到的是 Rake 0.9.2 的问题。好像没有完全安装。所以我不得不重新安装gem install rake -v=0.9.2

我不确定我是否安装了 rake –v0.9.1。因此,为了确保我的安全,我尝试使用 gem uninstall rake -v=0.9.1 删除那个旧版本。但是向我显示了错误消息

ERROR:  While executing gem ... (Gem::InstallError)
    cannot uninstall, check `gem list -d rake`

好的,所以我检查了我 PC 上的所有 Rake 目录,发现我只有 Rake 0.9.2。 然后为了检查一切是否正常,我使用rake db:migrate 进行了迁移。它奏效了:)

我认为我没有 Rake 0.9.1,因为我全新安装了 Ruby(rubyinstaller-1.9.2-p180 - 在我的 Windows 7 系统上)和所有 gem。与此同时,Rake 0.9.2 尚未完全安装。

【讨论】:

【参考方案15】:

使用 "gem uninstall rake" 卸载对我有用,我安装了 2 个版本,所以我开玩笑地重新安装了。

“rake db:create”,确保数据库存在 然后 "rake db:migrate" 完成交易。

【讨论】:

【参考方案16】:

我在使用 Rake 0.9.2.2 时遇到了同样的问题。我通过使用 bundle exec 解决了这个问题。

【讨论】:

【参考方案17】:

对于 Rails 2.3 编辑 lib/tasks/rspec.rake 喜欢在这个提交中为我工作:

https://github.com/dchelimsky/rspec-rails/pull/11/files

【讨论】:

【参考方案18】:

安装 rake 0.8.7 并卸载 0.9.2.2

$ gem install rake -v 0.8.7
$ gem uninstall rake -v 0.9.2.2

现在使用

$ bundle exec rake db:migrate

我认为这会对你有所帮助 ;)

【讨论】:

【参考方案19】:

运行

bundle exec rake db:migrate

它对我有用。

【讨论】:

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

Ruby on Rails:运行 rake 命令时出现错误消息

如何在 ruby​​ on rails 的亚马逊 aws 服务器中使用 gem 执行 rake 任务?

Ruby on Rails Rake在将rails项目从4.1.9更新到4.2.0后抛出“不正确的表名”错误

在 rake 任务中使用 rails logger,rails 5

Ruby on Rails:“无法加载此类文件”事件机器

ruby on rails 的使用过程中,遇到的错误及解决办法