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


189

我有一个非常令人沮丧的问题: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上查找过类似/相同的错误,而且人们也曾遇到过。似乎没有人能解决问题!

我该如何解决这个问题?

Answers:


193

DHH早些时候的一条推文。Rake .9.0破坏了Rails和其他一些功能,您需要:

gem "rake", "0.8.7"

在您的Gemfile中。


17
这对我有用。我需要先做bundle update rake。然后我检查了bundle show rake。应该说0.8.7。然后rake db:migrate
B B

26
甚至更好:gem "rake", "!= 0.9.0"。这样可以避免损坏的0.9.0版本,但是会在发布较新的版本时更新到较新的版本(以后删除此版本不会有任何危害,但保留它也不会有任何危害)。
Spiralis

6
@Spiralis我也遇到了0.9.2版本的问题。因此,您可能必须为几个版本添加该行。
dharmatech

3
该解决方案的工作为我工作。就像@dharmatech一样,我遇到了这个问题heroku rake db:migrate,这似乎已经解决了。记得在继续之前将这些更改添加并提交到git;)
pruett

1
这可能适用于Rails,但我还必须sudo gem install rake确保rake从命令行调用的版本不是0.8.7。
Autumnsault 2012年

72

我在回答之前就做了一些研究(对不起,在此之前我必须做)。

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

  • 我安装了gem install rake -v=0.9.2(我有0.9.1 gem)
  • 删除了0.9.1 gem uninstall rake -v=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可以正常工作!


遵循了前三个步骤,我没有收到任何警告,所以也没有打扰其他人,谢谢您的建议!
安倍·佩特里罗

1
这让我问...为什么我要破解Rake才能保留该功能?Rake打算做什么,我现在应该使用什么?
Ryanmt

@ Arrumaco,Rake文件的目录是什么?
Ctak

值得一提的是,RakeFile应该在之前添加内容require 'rake'-把我赶出场:)
Ciaran Archer

12
相同的问题,但我已经过耙(0.9.2,0.8.7)。重新安装0.9.2似乎可以解决问题:1)gem uninstall rake -v=0.9.22)gem install rake -v=0.9.2
DK。

54

仔细阅读Railstutorial的第2章(demo_app)并遇到了这个问题。我尝试了此处列出的所有其他答案,但是直到执行此操作才能使它起作用:

将其放在您的Rakefile中,上面需要'rake':

require 'rake/dsl_definition'

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

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


这似乎是最好的答案,因为从0.9.2降级到0.8.7会打破某些情况下的gem依赖关系,例如mine :)谢谢!
DiegoSalazar 2011年

它对我不起作用。在执行rake db:create时,我得到“没有要加载的文件-rake / dsl_definition”
KMC

25

我需要做的就是使用:

gem install rake

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


哇,对我有用。但是您能解释一下为什么我必须安装rake时我应该已经安装rake吗?
KMC 2012年

我仍然不是专家,但是我的理解是“将” gem安装到您的PC和“将” gem安装在gem注册表之间是有区别的-我怀疑这是因为Ruby安装需要知道哪些gem是在PC上的哪个位置。也许这可能会在未来实现自动化,或者已经在某些Ruby发行版中实现了自动化……
Branstar 2012年

19

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

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

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


这种方法为我工作,我宁愿不有降级的版本..
Tarnschaf

也为我工作,仅适用于rake -v 0.9.2.2
Haspemulator'1

10

如果不使用Bundler:

sudo gem install rake -v 0.8.7
sudo gem uninstall rake

然后选择卸载0.9.0。


这为我解决了不带捆扎机的问题(导轨2.3.8)。曾尝试安装rake 0.9.2,但没有解决。最终对我来说,安装0.8.7并卸载0.9.2是可行的。
Michael Durrant

8

如果像我一样,您陷入了rake 0.8.7的困境,并且使用的是Rails 3.2.x,那么railties会增加对Rake :: DSL的要求

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

module Rake
  module DSL
  end
end

7

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

在Gemfile中:

gem 'rake', '0.9.2'

然后在控制台上运行:

sudo bundle update rake

然后将以下行添加到Rakefile:

require 'rake/dsl_definition'
include Rake::DSL


4

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


4

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

我在gemfile中输入了gem“ rake”,“ 0.8.7”,然后从命令窗口中键入了以下内容。

bundle update rake

这解决了我的问题。


到今天为止,也为我工作。只是试图在Win7上编写rails。
arscariosus 2011年

4
  1. 转到您的项目路径
  2. 类型 bundle install --path=vendor/bundle
  3. 类型 bundle exec rake db:migrate

要启动服务器,请输入bundle exec rails s。使用bundle exec,您将确保为项目使用正确的gem(必需的版本)。另外vendor/bundle.gitignore如果您使用git并为其创建别名,我也建议您添加bundle exec。如果您使用zsh,可以按照这种方法


3

与上面的Branstar一样-谢谢Branstar!

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

我按照Windows上的“运行Rails 3”中的说明进行操作。

所有的工作都进行到“ rake db:migrate”部分为止,该部分给了我与原始帖子相同的输出。

我跑了:

gem install rake

我又跑了:

rake db:migrate

然后,我能够启动Ruby on Rails服务器并将一切就绪。

再次感谢Branstar :-)


2

我为您(mikhailvs)感到非常沮丧。我整整一天都疯了。我什至卸载了Ruby及其所有相关文件并关闭了PC,但仍然遇到相同的问题。

我从错误消息中得到的是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(在Windows 7系统上为rubyinstaller-1.9.2-p180-)和所有gems。同时,Rake 0.9.2尚未完全安装。


2

用卸载 “ gem卸载耙”进行的卸载对我有用,我安装了2个版本,所以我开玩笑地进行了重新安装。

“ rake db:create”,以确保数据库存在,然后“ rake db:migrate”达成协议。


2

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



0

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

我认为这会帮助您;)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.