web-dev-qa-db-ja.com

Rake 0.9.0を使用した未定義のメソッド 'task'

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"

この問題を修正するにはどうすればよいですか?

132

Rakeの0.9.0.beta.4バージョンを実行しているときにも同じ例外がありました。新しい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を使用する必要がある場合は、このクイックハックを使用しても問題ありません。

119
mordaroso

mordaroso's answer で説明されているように、Rake 0.9.0には問題があります。回避するには、Rakeを一時的にダウングレードする必要があります。

  1. 実行:gem uninstall rake -v 0.9Sudoを使用しない限り、rvmを追加)

  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

Duke's answer で提案されている解決策も試してください。

158
Andrei

注:これはRails 3.0.8で修正されました

Rakeの新しいバージョンでは、DSLコマンド(task、file、desc、importなど)をObject名前空間のルートに配置しなくなりました(Objectに配置すると、すべてのオブジェクトにタスクコマンドがあり、Niceではありません)。コマンドは、Rake::DSL moduleをコマンドを必要とするモジュールに混在させることで利用できます。

Ruby on RailsはRake 0.9.xで動作するように更新され、 "require rake"の後、Application.load_tasksの呼び出しの前にプロジェクトRakefileに以下を追加するまで:

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

この同じエラーに関するRails_adminの問題を作成しました。

答え

これは一般的なRails問題: http://Twitter.com/dhh/status/71966528744071169

それを修正する3.0.8のリリースがすぐにあるはずです。それまでの間、次の行をGemfileに追加できます。

gem 'rake'、 '〜> 0.8.7'

これはRake(0.9.0)の問題で、TwitterのDHHによって 発表済み でした。

昨日リリースされたRake 0.9はRails(およびその他)を壊しました。修正を待つ間、gemfileにgem 'rake'、 '0.8.7'が必要です。

16
Pablo Cantero

これは Ruby on Rails 3.0.8.rc1 で修正されており、数日後にリリースされるはずです。

7
Andrew Nesbitt

Rake 0.9.1がリリースされたばかりで、このエラーの原因となった変更を元に戻しますが、非推奨の警告を追加しています: https://github.com/jimweirich/rake/commit/44aec3ceac085740bce0c385bccd65fc4d1d911c

3
Andrew Nesbitt

Rvmを使用していますが、アンインストールしても役に立ちません。したがって、.rvm/gems/Ruby@globalディレクトリからすべての0.9ファイルを手動で削除すると、すべてが以前のようになります。

2
MikDiet

rake 0.9.xをアンインストールする必要なく、追加

gem 'rake'、 '〜> 0.8.7'

gemfileに入力して

バンドルexec rake -T

0
Helios