Неопределенный метод 'task' с использованием Rake 0.9.0

132

Я только что обновил 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"

Как я могу решить эту проблему?

Амокране Чентир
источник
7
Думаю, проблема существует и с rake-0.0.9 (выпущенным).
Кедар Мхасваде
4
ты про грабли, версия 0.9.0. но да, он сломан.
Роб
Так это проблема с тем, что я делаю, или с этой конкретной версией граблей? Спасибо, N
ifightcrime
просто столкнулся с этой проблемой, пытаясь разобраться
Мухаммад Усман

Ответы:

119

У меня было такое же исключение при запуске версии 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, можно использовать этот быстрый способ.

mordaroso
источник
Спасибо мордаросо за наводку!
Amokrane Chentir
14
Убедитесь, что вы изменили строку "module :: Anelis" на то, что соответствует имени вашего приложения rails. IE "module :: Myapp" Я забыл это сделать, и это решение не работало, пока я не осознал свою ошибку.
Скотт Суизи
1
Спасибо мордаросо за советы. Измените Anelis на имя своего приложения и добавьте этот волшебный код перед строкой YourAppName :: Application.load_tasks, иначе ошибка все равно возникает
Джанг Нгуен
10
И убедитесь, что вы поместили это между require 'rake'иMyApp::Application.load_tasks
Джитс
Похоже, это сохранилось в полной версии 0.9.0. Я вернул грабли к 0.8.7 в моем Gemfile.lock, пока он не был исправлен в направляющих и / или граблях. Ответ Андрея ниже, кажется, предполагает это.
sj26
158

Как объясняется в ответе Мордаросо , в Rake 0.9.0 есть проблема. Чтобы этого избежать, необходимо временно понизить рейтинг рейка:

  1. run: gem uninstall rake -v 0.9(добавьте, sudoесли вы не используете rvm)

  2. добавьте в свой Gemfile: gem 'rake', '~> 0.8.7'

  3. а затем запустить: bundle update

Вы можете пропустить первый шаг, но тогда вы должны работать , 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.

Обновить

Как заметил Алекс Чаффи в комментарии к ответу Пабло Кантеро , вам может потребоваться сделать следующее, чтобы удалить Rake, если вы все еще видите проблему

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

Также попробуйте решение, предложенное в ответе герцога .

Андрей
источник
2
Думаю, это наименее «хакерское» решение. Возможно, вам придется запустить rake, bundle exec rakeчтобы использовать рабочую версию из комплекта.
Стюарт К.
2
@Stuart K, bundle exec rakeнеобходим только в том случае, если rake-0.9 не был удален. В этом случае выдается сообщение об ошибкеrake aborted! You have already activated rake 0.9.0, but your Gemfile requires rake 0.8.7. Consider using bundle exec.
Андрей
1
Эта проблема также существует с Rails 3.0.7, с гемом Railties, требующим Rake> = 0.8.7, который использует 0.9 в качестве доступного ...
Мэтью Сэвидж,
3
Еще менее хитроумным является использование:gem 'rake', '~> 0.8.7'
Фабио Батиста,
Что именно вы имеете в виду, говоря «добавить в свой Gemfile»? Где этот Gemfile? Простите, вопрос n00b
Аднан
40

Примечание: это было исправлено в Rails 3.0.8.

Новая версия Rake больше не помещает свои команды DSL (task, file, desc, import и т. Д.) В корень пространства имен Object (размещение их в Object означает, что у каждого объекта есть команда задачи, не очень хорошая. DSL команды доступны путем подмешивания в Rake::DSL moduleлюбой модуль, нуждающийся в командах.

Пока Ruby on Rails не будет обновлен для работы с Rake 0.9.x, добавьте в свой проект Rakefile после "require rake" и перед вызовом Application.load_tasks:

class Rails::Application
  include Rake::DSL if defined?(Rake::DSL)
end
герцог
источник
Я использую Rails 3.0.7 с обновленным рейком до 0.9.0, но по умолчанию в Gemfile.lock он равен 0.8.7, поэтому, если мы обновились до 0.9.0, он работает нормально, чем Duke
Jagdish Barabari
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 (и другие). Пока мы ждем исправления, вам понадобится гем 'rake', '0.8.7' в вашем Gemfile.

Пабло Кантеро
источник
2
Этого может быть недостаточно, если на вашем PATH все еще есть каталог rake 0.9.0 / bin. Чтобы действительно удалить rake, вам нужно это сделать gem uninstall rake --version 0.9.0 && gem install rake --version 0.8.7(вторая установка - вернуть исполняемый файл).
AlexChaffee
1
И если рейк 0.9.0 попал в ваш rvm global gemset, вам нужно это сделатьrvm use @global && gem uninstall rake --version 0.9.0 && rvm use @ && gem uninstall rake --version 0.9.0 && gem install rake --version 0.8.7
AlexChaffee
7

Это было исправлено в Ruby on Rails 3.0.8.rc1, который должен быть выпущен через несколько дней.

Эндрю Несбитт
источник
2

Я использую rvm, но удаление мне не помогает. Итак, я вручную удаляю все файлы 0.9 из .rvm/gems/ruby@globalкаталога, и все становится как прежде!

MikDiet
источник
0

без удаления Rake 0.9.x добавьте

драгоценный камень 'грабли', '~> 0.8.7'

в свой Gemfile и просто введите

связка exec rake -T

Helios
источник
Обратите внимание, что в 0.9.1 проблема была устранена, поэтому вы можете использовать эту версию вместо перехода на 0.8.7.
Amokrane Chentir