NoMethodError: 升级到 rake 11后未定义的方法‘ last_comments’

当运行任何 rake任务时,我得到:

NoMethodError: 未定义的方法‘ last _ comments’用于

这是在 bundle update之后,拉在新版本的耙,版本 11.0.1

$ grep rake Gemfile.lock
rake
rake (>= 0.8.7)
rake (11.0.1)
rake
$ bundle update
$ bundle exec rake db:drop # any rake task

NoMethodError: # < Rake: : Application: 0x007ff0cf37be38 > 的未定义方法‘ last _ comments’

版本

  • Rails 3.2.11
  • Rake 11.0.1
43381 次浏览

Rake 11.0.1 移除 Rails2.3 rspec-core (< 3.4.4)使用的 last_comment方法。因此,在发布补丁之前,我们需要将 rake 固定在 Gemfile 的旧版本上:

gem 'rake', '< 11.0'

然后:

$ bundle update
$ grep rake Gemfile.lock
rake
rake (>= 0.8.7)
rake (10.5.0)
rake
rake (< 11.0)

我们现在使用 rake 10.5.0,它仍然有 last_comment方法,我们的 rake任务将再次工作。

UPDATE : 现在在 rspec 中已经修复了这个问题,因此唯一需要做的事情就是更新 rspec。

在 Rails 快速修复可以编辑 ./Rakefile(在您的应用程序文件夹)

并在调用 Rails.application.load_tasks之前添加以下行:

module TempFixForRakeLastComment
def last_comment
last_description
end
end
Rake::Application.send :include, TempFixForRakeLastComment

所以整个 Rakefile看起来

  require File.expand_path('../config/application', __FILE__)
require 'rake'
require 'resque/tasks'


+ # temp fix for NoMethodError: undefined method `last_comment'
+ # remove when fixed in Rake 11.x
+ module TempFixForRakeLastComment
+   def last_comment
+     last_description
+   end
+ end
+ Rake::Application.send :include, TempFixForRakeLastComment
+ ### end of temfix
+
task "resque:preload" => :environment


Rails.application.load_tasks

这是一个已经解决的 问题

@ equvalent8给出的答案是一个猴子补丁,应该避免使用。

正如@Kris 指出的,这是 rake 11.0.1独有的问题。因为@Kris 已经发布了他的回复,现在有了新版本的 Rake,理想的情况是你可以与时俱进,而不是被钉在旧版本的 Rake 上。相信我,我也经历过,如果你帮不上忙,那可不是个好主意。而且这也不是 Rails 2.3或者其他任何版本的 Rails 的问题。

任何 Rake < v11.0.1> v11.0.1 and < v12将工作,但这仍然是一个周围的工作,也应该避免; 理想情况下,你将能够留在时代。

由于 last_comment已被弃用,因此应该对依赖项本身进行升级。在我的情况下,它是 rspec-core,顺便只修复这在 V3.4.4

The Fix

将依赖关系升级到不调用 last_comment而调用 last_description的版本。它的 rspec可能和升级 rspec-core到3.4.4或更高将修复它。rspec-core < 3.4。4呼叫 last_comment

如果你的依赖没有一个不能调用 last_description的版本,做一个好公民,提交一个公关来修复它:)

更新到最新的 Rspec gem 可以完成这项工作:

bundle update rspec-rails

升级宝石 rspec-rails

现在: gem 'rspec-rails', '~> 3.5', '>= 3.5.2'

拥抱!