使用 Rake 0.9.0的未定义方法“ task”

我刚刚将 耙子更新到最新版本(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"

我怎样才能解决这个问题?

34032 次浏览

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

So I added following code to my 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,那么使用这个快速黑客技术可能没有问题。

正如在 Mordaroso 的回答中所解释的,Rake 0.9.0中存在一个问题。你需要暂时降低 Rake 的评级以避免它:

  1. Run: gem uninstall rake -v 0.9(除非使用 rvm,否则添加 sudo)

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

  3. 然后运行: bundle update

您可以跳过第一步,但接下来必须使用 bundle exec运行 rake,例如:

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 的回答的评论中所注意到的,如果您仍然看到问题,那么您可能需要执行以下操作来卸载 Rake

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

也可以尝试 杜克的回答中建议的解决方案。

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

我已经为 ails _ admin 创建了一个关于这个错误的问题。

答案是:

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

很快就会有一个3.0.8版本来修复这个问题。同时,你可以在你的 Gemfile 中添加以下代码:

Gem‘ rake’,’~ > 0.8.7’

这是 Rake (0.9.0)中的一个问题,它是 DHH 在 Twitter 上的 宣布

Rake 0.9昨天发布,它破坏了 Rails (和其他一些软件)。在我们等待修复的时候,你需要在你的 Gemfile 中加入 gem‘ rake’,‘0.8。

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

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

在 Ruby on Rails 升级到可以使用 Rake 0.9. x 之前,在你的项目 Rakefile 中在“ need Rake”之后和调用 Application.load_tasks之前放入以下内容:

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

这已经被修复在 Ruby on Rails 3.0.8. rc1,应该在几天的时间释放。

Rake 0.9.1刚刚发布,它逆转了导致这个错误的更改,但是增加了一个弃用警告: https://github.com/jimweirich/rake/commit/44aec3ceac085740bce0c385bccd65fc4d1d911c

不需要卸载 Rake 0.9. x,添加

Gem‘ rake’,’~ > 0.8.7’

输入你的 Gemfile

捆绑执行机构耙-T 捆绑执行机构耙-T