使用Rake 0.9.0的未定义方法'任务'

时间:2011-03-13 03:04:49

标签: ruby-on-rails-3 rake

我刚刚将Rake更新为最新版本(0.9.0.beta.4),rake命令最终出现以下错误消息:

rake aborted!
undefined method `task' for #<Anelis::Application:0x9223b6c>

这是跟踪:

undefined method `task' for #<Anelis::Application:0x97ef80c>
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application.rb:214:in `initialize_tasks'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application.rb:139:in `load_tasks'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application.rb:77:in `method_missing'
/home/amokrane/Documents/prog/web/learning_rails/anelis/Rakefile:7:in `load_string'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/environment.rb:28:in `eval'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/environment.rb:28:in `load_string'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/environment.rb:16:in `load_rakefile'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:495:in `raw_load_rakefile'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:78:in `block in load_rakefile'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:129:in `standard_exception_handling'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:77:in `load_rakefile'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:61:in `block in run'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:129:in `standard_exception_handling'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/lib/rake/application.rb:59:in `run'
/usr/local/rvm/gems/ruby-1.9.2-p136/gems/rake-0.9.0.beta.4/bin/rake:31:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.2-p136/bin/rake:19:in `load'
/usr/local/rvm/gems/ruby-1.9.2-p136/bin/rake:19:in `<main>'

任何人都遇到过同样的问题吗?什么可能是错的?请注意,我正在运行Rails 3.0.3,您可能也对我的Gemfile的内容感兴趣:

source 'http://rubygems.org'
gem 'rails', '3.0.3'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'mysql2'
gem 'legacy_data'
gem 'resources_controller', :git => 'git://github.com/ianwhite/resources_controller'
gem 'will_paginate', '3.0.pre' # pagination
gem 'jquery-rails', '>= 0.2.6'
gem "rmagick" # sudo aptitude install libmagick9-dev
gem "paperclip", "~> 2.3"
gem "nested_form", :git => "git://github.com/madebydna/nested_form.git"
gem "meta_search"
gem "hirb"
gem "devise"
gem "rails_admin", :git => "git://github.com/sferik/rails_admin.git"

如何解决此问题?

8 个答案:

答案 0 :(得分:158)

mordaroso's answer中所述,Rake 0.9.0中存在问题。您需要暂时降级Rake以避免它:

  1. 运行:gem uninstall rake -v 0.9(添加sudo除非您使用rvm

  2. 添加到您的Gemfile:gem 'rake', '~> 0.8.7'

  3. 然后运行:bundle update

  4. 您可以跳过第一步,但之后必须使用rake运行bundle exec,例如:

    bundle exec rake db:migrate
    

    否则会出现以下错误。

    rake aborted!
    You have already activated rake 0.9.0, but your Gemfile requires rake 0.8.7. Consider using bundle exec.
    

    更新

    正如Alex Chaffee在Pablo Cantero's answer的评论中注意到的那样,如果您仍然看到问题,则可能需要执行以下操作来卸载Rake

    rvm use @global && gem uninstall rake -v 0.9.0
    rvm use @       && gem uninstall rake -v 0.9.0
    

    同时尝试Duke's answer中建议的解决方案。

答案 1 :(得分:119)

运行0.9.0.beta.4版本的Rake时遇到了同样的异常。 看起来新的Rake::DSL未正确加载。

所以我将以下代码添加到我的Rakefile中:

require 'rake'

# Rake Fix Code start
# NOTE: change 'Anelis' to your app's module name (see config/application.rb)
module ::Anelis
  class Application
    include Rake::DSL
  end
end

module ::RakeFileUtils
  extend Rake::FileUtilsExt
end
# Rake Fix Code end

MyApp::Application.load_tasks

这样我就可以再次运行我的Rake任务了。

我知道这不是一个优雅的解决方案。但是如果你必须使用--pre版本的Rake,那么使用这个快速黑客可能是正确的。

答案 2 :(得分:39)

注意:这只是在Rails 3.0.8中修复

Rake的新版本不再将其DSL命令(任务,文件,desc,导入等)放在Object命名空间的根目录中(将它们放在Object中意味着每个对象都有一个任务命令,不是很好通过将Rake::DSL module混合到需要命令的任何模块中,可以获得DSL命令。

在Ruby on Rails更新以使用Rake 0.9.x之前,在“require rake”之后和调用Application.load_tasks之前将以下内容放入项目Rakefile中:

class Rails::Application
  include Rake::DSL if defined?(Rake::DSL)
end

答案 3 :(得分:16)

我为rails_admin创建了一个关于同样错误的问题。

The answer

  

这是一般的Rails问题:http://twitter.com/dhh/status/71966528744071169

     

应该会很快发布3.0.8版本。同时,您可以将以下行添加到您的Gemfile:

     

gem'rake','〜&gt; 0.8.7'

这是Rake(0.9.0)中的一个问题,DHH在推特上是announced

  

昨天发布的Rake 0.9打破了Rails(和其他人)。当我们等待修复时,你需要在你的Gemfile中使用gem'rake','0.8.7'。

答案 4 :(得分:7)

这已在Ruby on Rails 3.0.8.rc1中修复,应在几天后发布。

答案 5 :(得分:3)

Rake 0.9.1刚刚发布,它可以撤消导致此错误的更改但添加了弃用警告:https://github.com/jimweirich/rake/commit/44aec3ceac085740bce0c385bccd65fc4d1d911c

答案 6 :(得分:2)

我使用rvm,但卸载对我没有帮助。所以我手动从.rvm/gems/ruby@global目录中删除所有0.9文件,一切都变得像以前一样!

答案 7 :(得分:0)

无需卸载Rake 0.9.x,添加

  

gem'rake','〜&gt; 0.8.7'

到您的Gemfile,然后输入

  

捆绑exec rake -T