使用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(已发布)也存在问题。
Kedar Mhaswade,2011年

4
您的意思是耙,版本0.9.0。但是,是的,它坏了。
罗布

那么这是我正在做的事情的问题还是此特定版本的rake的问题?谢谢,N
ifightcrime

刚刚遇到这个问题,试图找出
答案

Answers:


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

这样,我可以再次运行Rake任务。

我知道这不是一个很好的解决方案。但是,如果您必须使用--preRake 的版本,则可以使用此快速技巧。


感谢mordaroso的小费!
Amokrane Chentir 2011年

14
确保将“ module :: Anelis”行更改为与您的Rails应用程序名称相匹配的名称。IE“ module :: Myapp”我忘记这样做了,直到我意识到自己的错误,该解决方案才起作用。
Scott Swezey

1
感谢mordaroso的提示。将Anelis更改为您的应用程序名称,并在YourAppName :: Application.load_tasks行之前添加这些魔术代码,否则仍会发生错误
Giang Nguyen

10
并确保将其放在require 'rake'MyApp::Application.load_tasks
Jits 2011年

看起来这种情况一直存在到0.9.0完整版本中。我已经在我的Gemfile.lock中将rake恢复到0.8.7,直到此错误已解决。安德烈(Andrei)在下面的回答似乎暗示了这一点。
sj26

158

mordaroso的答案所述,Rake 0.9.0中存在问题。您需要暂时降级Rake以避免它:

  1. 运行:(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.

更新资料

正如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的答案中建议的解决方案。


2
我认为这是最不“ hacky”的解决方案。您可能需要运行rake bundle exec rake才能使用捆绑包版本。
Stuart K

2
bundle exec rake仅当未卸载rake-0.9时才需要@StuartK 。在这种情况下,一个得到错误信息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 ...
Matthew Savage

3
即使少哈克是使用:gem 'rake', '~> 0.8.7'
法比奥·巴蒂斯塔

“添加到您的Gemfile”是什么意思?这个Gemfile在哪里?抱歉,n00b问题
阿德南(Adnan)

40

注意:这仅在Rails 3.0.8中修复

新版本的Rake不再将其DSL命令(任务,文件,desc,导入等)放在Object名称空间的根目录中(将它们放在Object中意味着每个对象都有一个任务命令,不是很好)。通过将混入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,则它的工作原理
优于

16

我为rails_admin创建了一个与此错误有关的问题。

答案

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

很快应该有一个3.0.8版本可以修复它。同时,您可以将以下行添加到Gemfile中:

宝石'rake','〜> 0.8.7'

DHH在Twitter上宣布这是Rake(0.9.0)中的一个问题。

昨天发布的Rake 0.9打破了Rails(及其他)。当我们等待修复时,您会在Gemfile中需要gem'rake','0.8.7'。


2
如果您的PATH上仍然有rake 0.9.0的/ bin目录,这可能还不够。要真正卸载rake,您必须做gem uninstall rake --version 0.9.0 && gem install rake --version 0.8.7(第二次安装是取回可执行文件)。
AlexChaffee 2011年

1
如果rake 0.9.0进入了您的rvm全局宝石集,那么您就必须这样做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 2011年



2

我使用rvm,但是卸载无济于事。因此,我手动从.rvm/gems/ruby@global目录中删除了所有0.9文件,一切都变得和以前一样!


0

无需卸载Rake 0.9.x,添加

宝石'rake','〜> 0.8.7'

到您的Gemfile并输入

捆绑执行耙-T


请注意,0.9.1解决了该问题,因此您可以使用该版本而不是降级到0.8.7。
Amokrane Chentir 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.