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

Amo*_*tir 132 rake ruby-on-rails-3

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

rake aborted!
undefined method `task' for #<Anelis::Application:0x9223b6c>
Run Code Online (Sandbox Code Playgroud)

这是跟踪:

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>'
Run Code Online (Sandbox Code Playgroud)

有人经历过同样的问题吗?什么可能是错的?请注意,我正在运行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"
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

And*_*rei 158

正如mordaroso的回答中所解释的那样,Rake 0.9.0存在问题.您需要暂时降级Rake以避免它:

  1. 运行:( 除非你使用gem uninstall rake -v 0.9添加)sudorvm

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

  3. 然后运行: bundle update

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

bundle exec rake db:migrate
Run Code Online (Sandbox Code Playgroud)

否则您会收到以下错误.

rake aborted!
You have already activated rake 0.9.0, but your Gemfile requires rake 0.8.7. Consider using bundle exec.
Run Code Online (Sandbox Code Playgroud)

更新

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

rvm use @global && gem uninstall rake -v 0.9.0
rvm use @       && gem uninstall rake -v 0.9.0
Run Code Online (Sandbox Code Playgroud)

也尝试杜克答案中建议的解决方案.

  • 更糟糕的是使用:'gem'rake','〜> 0.8.7' (3认同)
  • 我认为这是最不"hacky"的解决方案.你可能需要运行rake作为`bundle exec rake`来使用工作捆绑版本. (2认同)
  • @Stuart K,只有在未卸载rake-0.9时才需要`bundle exec rake`.在这种情况下,会收到错误消息`rake aborted!你已经激活了rake 0.9.0,但你的Gemfile需要rake 0.8.7.考虑使用bundle exec (2认同)

mor*_*oso 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 确保你将"module :: Anelis"行更改为与rails应用程序名称相匹配的任何内容.IE"module :: Myapp"我忘了这样做,直到我意识到我的错误,这个解决方案才有效. (14认同)
  • 并确保你把它放在`require'rake'`和`MyApp :: Application.load_tasks`之间 (10认同)
  • 不起作用.https://gist.github.com/984320 =>未定义的方法`任务' (2认同)

Duk*_*uke 39

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

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

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

class Rails::Application
  include Rake::DSL if defined?(Rake::DSL)
end
Run Code Online (Sandbox Code Playgroud)

  • (jimweirich提供) (2认同)

Pab*_*ero 16

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

答案是:

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

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

宝石'耙','〜> 0.8.7'

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

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

  • 如果你的PATH仍然有rake 0.9.0的/ bin目录,这可能还不够.要真正卸载rake,你必须做`gem uninstall rake --version 0.9.0 && gem install rake --version 0.8.7`(第二次安装是为了获得可执行文件). (2认同)

And*_*itt 7

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