Metode 'tugas' yang tidak ditentukan menggunakan Rake 0.9.0

132

Saya baru saja memperbarui Rake ke versi terbaru ( 0.9.0.beta.4) dan rakeperintah berakhir dengan pesan kesalahan berikut:

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

Inilah jejaknya:

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

Adakah yang mengalami masalah yang sama? Apa yang mungkin salah? Perhatikan bahwa saya sedang menjalankan Rails 3.0.3, Anda mungkin juga tertarik dengan konten Gemfile saya:

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"

Bagaimana saya bisa memperbaiki masalah ini?

Amokrane Chentir
sumber
7
Saya pikir ada masalah dengan rake-0.0.9 (dirilis) juga.
Kedar Mhaswade
4
maksudmu menyapu, versi 0.9.0. tapi, ya, itu rusak.
Rob
jadi apakah ini masalah dengan sesuatu yang saya lakukan atau masalah dengan versi rake tertentu ini? Terima kasih, N
ifightcrime
baru saja menemukan masalah ini juga, mencoba memecahkannya
Muhammad Usman

Jawaban:

119

Saya memiliki pengecualian yang sama ketika menjalankan versi Rake 0.9.0.beta.4. Sepertinya yang baru Rake::DSLtidak dimuat dengan benar.

Jadi saya menambahkan kode berikut ke Rakefile saya:

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

Dengan begitu saya bisa menjalankan tugas Rake saya lagi.

Saya tahu ini bukan solusi yang elegan. Tetapi jika Anda harus menggunakan --preversi Rake, boleh saja menggunakan peretas cepat ini.

mordaroso
sumber
Terima kasih mordaroso untuk tipnya!
Amokrane Chentir
14
Pastikan Anda mengubah baris "module :: Anelis" ke apa pun yang cocok dengan nama aplikasi rel Anda .. IE "module :: Myapp" Saya lupa melakukan itu, dan solusi ini tidak berfungsi sampai saya menyadari kesalahan saya.
Scott Swezey
1
Terima kasih mordaroso untuk tipsnya. Ubah Anelis ke nama aplikasi Anda dan tambahkan kode ajaib itu sebelum baris YourAppName :: Application.load_tasks jika tidak kesalahan masih terjadi
Giang Nguyen
10
Dan pastikan Anda menempatkan ini antara require 'rake'danMyApp::Application.load_tasks
Jits
Sepertinya ini telah berlanjut ke rilis lengkap 0.9.0. Saya telah menarik rake kembali ke 0.8.7 di Gemfile saya. Buka sampai ini diperbaiki di rails dan / atau rake. Jawaban di bawah oleh Andrei tampaknya menyarankan ini.
sj26
158

Seperti yang dijelaskan dalam jawaban mordaroso , ada masalah di Rake 0.9.0. Anda perlu menurunkan versi Rake sementara untuk menghindarinya:

  1. jalankan: gem uninstall rake -v 0.9(tambahkan sudokecuali Anda menggunakan rvm)

  2. tambahkan ke Gemfile Anda: gem 'rake', '~> 0.8.7'

  3. lalu jalankan: bundle update

Anda dapat melewati langkah pertama, tetapi kemudian Anda harus menjalankan rakemenggunakan bundle exec, misalnya:

bundle exec rake db:migrate

Kalau tidak, Anda mendapatkan kesalahan berikut.

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

Memperbarui

Seperti Alex Chaffee perhatikan dalam komentar untuk jawaban Pablo Cantero , bahwa Anda mungkin perlu melakukan yang berikut untuk menghapus Rake jika Anda masih melihat masalahnya

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

Coba juga solusi yang disarankan dalam jawaban Duke .

Andrei
sumber
2
Saya pikir ini adalah solusi yang paling "tidak rapi". Anda mungkin perlu menjalankan rake bundle exec rakeuntuk menggunakan versi paket yang berfungsi.
Stuart K
2
@Stuart K, bundle exec rakediperlukan hanya jika rake-0.9 tidak dihapus. Dalam hal ini seseorang mendapat pesan kesalahanrake aborted! You have already activated rake 0.9.0, but your Gemfile requires rake 0.8.7. Consider using bundle exec.
Andrei
1
Masalah ini juga ada dengan Rails 3.0.7, dengan permata Railties membutuhkan Rake> = 0.8.7, yang menarik 0,9 sebagai tersedia ...
Matthew Savage
3
Bahkan lebih sedikit peretasan adalah dengan menggunakan:gem 'rake', '~> 0.8.7'
Fábio Batista
Dengan "tambahkan ke Gemfile Anda", apa sebenarnya yang Anda maksud? Di mana Gemfile ini? Maaf, pertanyaan n00b
Adnan
40

Catatan: Ini baru saja diperbaiki di Rails 3.0.8

Versi baru Rake tidak menempatkan perintah DSL-nya (tugas, file, desc, impor, dll) di root namespace Object lagi (menempatkan mereka di Object berarti setiap objek memiliki perintah tugas, tidak terlalu bagus. DSL perintah tersedia dengan mencampur Rake::DSL moduleke dalam modul apa pun yang membutuhkan perintah.

Sampai Ruby on Rails diperbarui untuk bekerja dengan Rake 0.9.x, masukkan yang berikut ini di proyek Anda Rakefile setelah "memerlukan rake" dan sebelum panggilan ke Application.load_tasks:

class Rails::Application
  include Rake::DSL if defined?(Rake::DSL)
end
Bangsawan tinggi
sumber
Saya menggunakan Rails 3.0.7, dengan rake diperbarui ke 0.9.0 tetapi secara default di Gemfile.lock adalah 0.8.7 jadi jika kami memperbarui ke 0.9.0 itu berfungsi dengan baik daripada Duke
Jagdish Barabari
16

Saya telah membuat masalah untuk rails_admin tentang kesalahan yang sama ini.

Jawabannya :

Ini adalah masalah Rails umum: http://twitter.com/dhh/status/71966528744071169

Seharusnya segera ada rilis 3.0.8 yang memperbaikinya. Sementara itu, Anda dapat menambahkan baris berikut ke Gemfile Anda:

permata 'rake', '~> 0.8.7'

Ini masalah di Rake (0.9.0), diumumkan oleh DHH di Twitter.

Rake 0.9, yang dirilis kemarin, mematahkan Rails (dan lainnya). Sementara kami menunggu perbaikan, Anda akan menginginkan permata 'rake', '0.8.7' di Gemfile Anda.

Pablo Cantero
sumber
2
Ini mungkin tidak cukup, jika PATH Anda masih memiliki rake direktori 0.9.0 / bin di dalamnya. Untuk benar-benar menghapus rake, Anda harus melakukan gem uninstall rake --version 0.9.0 && gem install rake --version 0.8.7(instalasi kedua adalah untuk mendapatkan kembali dieksekusi).
AlexChaffee
1
Dan jika rake 0.9.0 mendapat insto rvm global gemset Anda, Anda harus melakukannyarvm 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

Saya menggunakan rvm, tetapi menghapus instalan tidak membantu saya. Jadi saya secara manual menghapus semua file 0,9 dari .rvm/gems/ruby@globaldirektori dan semuanya menjadi seperti sebelumnya!

MikDiet
sumber
0

tanpa perlu menghapus Rake 0.9.x, tambahkan

permata 'rake', '~> 0.8.7'

ke Gemfile Anda dan ketik saja

bundle exec rake -T

Helios
sumber
Perhatikan bahwa 0.9.1 memperbaiki masalah, sehingga Anda dapat menggunakan versi itu alih-alih menurunkan versi ke 0.8.7.
Amokrane Chentir