NoMethodError:升级到Rake 11后未定义的方法“ last_comment”


130

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

NoMethodError:未定义的方法“ last_comment”

之后bundle update,引入了新版本的rake版本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_comment'

版本号

  • 导轨3.2.11
  • 耙11.0.1

Answers:


159

耙11.0.1 移除last_comment方法,该方法Rails 2.3rspec-core(<3.4.4)使用。因此,直到/如果发布补丁,我们需要将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。


我必须bundle exec在执行此操作后使用,如何仍然rake不使用bundle exec 继续使用?
svelandiag '16

您能否阐明“ Rails 2.3”的使用注释?我在Rails 4上rake db:create:all抛出此异常。
yekta

@yekta Rails 2.3希望Rake有一个称为的方法last_comment,在代码库中我不记得了。我不知道Rails 4是否也会打电话last_comment。但是您可以签出rails代码库,切换到Rails 4分支,并在Rakefile和中为“ last_comment”使用grep *.task
克里斯(Kris)

7
谢谢您的参与,仍然在2017
。– Nick Schwaderer 17-02-26

2
@luke rspec 3.5或更高版本。
克里斯(Kris)

73

在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

谢谢。从Rake 11.1.0起不再需要
sethcall

10
不错,我走了5分钟成名:D
相当于

3
看起来删除last_comment 了已还原的内容,现在将在rake 12.0中删除。
克里斯(Kris)

3
升级到rake 12.0.0后,我开始看到此错误。@ equivalent8的临时修复对我有用。
blackwood

1
升级到rspec-core-3.5.4为我解决了这个问题,我能够删除此答案中的猴子补丁。
neontapir

27

更新到最新的Rspecgem可以正常工作:

bundle update rspec-rails


7
在StackOverflow上找到我自己的答案- 我写它已有3年了-仍然像魔术一样工作:)
Gal Bracha

3
这不是“总是”一个好的解决方案,可以安装不兼容的rspec -rails版本,最好始终指定要使用的版本。
阿诺德·罗阿

21

只需升级宝石 rspec-rails

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

拥抱!


1
gem 'rspec-rails', '~> 3.6'救了我的命,非常感谢!我以为我的代码中有类似last_comment的东西!大声笑
user1735921

20

这是rake中的一个问题,已经解决。

@ equivalent8的答案是猴子补丁,应避免使用。

正如@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中修复了此问题

修复

将您的依赖项升级到一个不调用last_comment而是调用的版本last_description。它可能会rspec升级rspec-core到3.4.4或更高版本来解决。 rspec-core<3.4.4电话last_comment

如果您的依赖项没有不可用的版本,请last_description成为好公民并提交PR进行修复:)

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.