Niezdefiniowana metoda „zadanie” wykorzystująca Rake 0.9.0

132

Właśnie zaktualizowałem Rake do najnowszej wersji ( 0.9.0.beta.4) i rakepolecenie kończy się następującym komunikatem o błędzie:

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

Oto ślad:

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>'

Czy ktoś napotkał ten sam problem? Co może być nie tak? Zwróć uwagę, że korzystam Rails 3.0.3, możesz być także zainteresowany zawartością mojego pliku 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"

Jak mogę rozwiązać ten problem?

Amokrane Chentir
źródło
7
Myślę, że problem istnieje również w przypadku rake-0.0.9 (zwolniony).
Kedar Mhaswade
4
masz na myśli rake, wersja 0.9.0. ale tak, jest zepsuty.
Rob
więc czy jest to problem z czymś, co robię, czy problem z tą konkretną wersją rake? Dzięki, N
przestępstwo zbrodni
właśnie natknąłem się na ten problem, próbując go rozgryźć
Muhammad Usman

Odpowiedzi:

119

Miałem ten sam wyjątek podczas uruchamiania wersji 0.9.0.beta.4 programu Rake. Wygląda na to, że nowy Rake::DSLnie jest poprawnie załadowany.

Więc dodałem następujący kod do mojego 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

W ten sposób mogłem ponownie uruchomić moje zadania Rake.

Wiem, że to nie jest eleganckie rozwiązanie. Ale jeśli musisz użyć --prewersji Rake, możesz skorzystać z tego szybkiego hacka.

mordaroso
źródło
Dzięki mordaroso za cynk!
Amokrane Chentir
14
Upewnij się, że zmieniłeś wiersz "module :: Anelis" na taki, który pasuje do nazwy twojej aplikacji railsowej. IE "module :: Myapp" Zapomniałem o tym, a to rozwiązanie nie działało, dopóki nie zdałem sobie sprawy z mojego błędu.
Scott Swezey
1
Dzięki mordaroso za wskazówki. Zmień Anelis na nazwę swojej aplikacji i dodaj ten magiczny kod przed wierszem YourAppName :: Application.load_tasks, w przeciwnym razie błąd nadal występuje
Giang Nguyen
10
I upewnij się, że umieścisz to między require 'rake'aMyApp::Application.load_tasks
Jits
Wygląda na to, że utrzymało się to w pełnej wersji 0.9.0. Przywróciłem prowizję do 0.8.7 w moim Gemfile.lock, dopóki nie zostanie to naprawione w szynach i / lub grabie. Wydaje się, że sugeruje to poniższa odpowiedź Andrieja.
sj26
158

Jak wyjaśniono w odpowiedzi mordaroso , w Rake 0.9.0 jest problem. Aby tego uniknąć, musisz tymczasowo obniżyć Rake:

  1. run: gem uninstall rake -v 0.9(dodaj, sudochyba że używasz rvm)

  2. dodaj do swojego Gemfile: gem 'rake', '~> 0.8.7'

  3. a następnie uruchom: bundle update

Możesz pominąć pierwszy krok, ale wtedy musisz biec rakeużywając bundle execnp .:

bundle exec rake db:migrate

W przeciwnym razie pojawi się następujący błąd.

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

Aktualizacja

Jak zauważył Alex Chaffee w komentarzu do odpowiedzi Pablo Cantero , być może będziesz musiał wykonać następujące czynności, aby odinstalować Rake, jeśli nadal widzisz problem

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

Wypróbuj także rozwiązanie sugerowane w odpowiedzi Duke'a .

Andrei
źródło
2
Myślę, że jest to najmniej „hakerskie” rozwiązanie. Może być konieczne uruchomienie rake, bundle exec rakeaby użyć działającej wersji pakietu.
Stuart K
2
@Stuart K bundle exec rakejest potrzebny tylko wtedy, gdy rake-0.9 nie został odinstalowany. W tym przypadku pojawia się komunikat o błędzierake aborted! You have already activated rake 0.9.0, but your Gemfile requires rake 0.8.7. Consider using bundle exec.
Andrei
1
Ten problem występuje również w Rails 3.0.7, gdzie klejnot Railties wymaga Rake> = 0.8.7, który pobiera 0.9 jako dostępne ...
Matthew Savage
3
Jeszcze mniej hackem jest użycie:gem 'rake', '~> 0.8.7'
Fábio Batista
Co dokładnie masz na myśli, mówiąc „dodaj do pliku Gemfile”? Gdzie jest ten plik Gemfile? Przepraszamy, pytanie n00b
Adnan
40

Uwaga: zostało to właśnie naprawione w Railsach 3.0.8

Nowa wersja Rake nie umieszcza już swoich poleceń DSL (task, file, desc, import, itp.) W katalogu głównym przestrzeni nazw Object (umieszczenie ich w Object oznaczało, że każdy obiekt ma polecenie zadania, niezbyt ładne. DSL polecenia są dostępne poprzez dodanie Rake::DSL moduledo dowolnego modułu wymagającego poleceń.

Dopóki Ruby on Rails nie zostanie zaktualizowany do pracy z Rake 0.9.x, umieść w swoim projekcie Rakefile następujący kod po „require rake”, a przed wywołaniem Application.load_tasks:

class Rails::Application
  include Rake::DSL if defined?(Rake::DSL)
end
Książę
źródło
Używam Rails 3.0.7, z prowizją zaktualizowaną do 0.9.0, ale domyślnie w Gemfile.lock jest to 0.8.7, więc jeśli zaktualizowaliśmy do 0.9.0, działa dobrze niż
x
16

Utworzyłem problem dla rails_admin dotyczący tego samego błędu.

Odpowiedź :

To jest ogólny problem z Railsami: http://twitter.com/dhh/status/71966528744071169

Wkrótce powinno pojawić się wydanie 3.0.8, które to naprawi. W międzyczasie możesz dodać następujący wiersz do swojego pliku Gemfile:

gem 'rake', '~> 0.8.7'

To problem w Rake (0.9.0), poinformował o tym DHH na Twitterze.

Rake 0.9, który został wydany wczoraj, zepsuł Railsy (i inne). Kiedy czekamy na poprawkę, w swoim Gemfile będziesz potrzebować `` prowizji '' klejnotów, `` 0.8.7 ''.

Pablo Cantero
źródło
2
Może to nie wystarczyć, jeśli PATH nadal zawiera katalog rake 0.9.0 / bin. Aby naprawdę odinstalować rake, musisz to zrobić gem uninstall rake --version 0.9.0 && gem install rake --version 0.8.7(druga instalacja to odzyskanie pliku wykonywalnego).
AlexChaffee
1
A jeśli rake 0.9.0 dostał się na twój globalny zestaw rvm, musisz to zrobić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
2

Używam rvm, ale odinstalowanie mi nie pomaga. Więc ręcznie usuwam wszystkie pliki 0.9 z .rvm/gems/ruby@globalkatalogu i wszystko wygląda jak wcześniej!

MikDiet
źródło
0

bez konieczności odinstalowywania Rake 0.9.x, dodaj

gem 'rake', '~> 0.8.7'

do swojego Gemfile i po prostu wpisz

pakiet exec rake -T

Helios
źródło
Zwróć uwagę, że 0.9.1 rozwiązało problem, więc możesz używać tej wersji zamiast obniżać do 0.8.7.
Amokrane Chentir