Spork不会重新加载代码

not*_*ere 11 rspec ruby-on-rails guard spork ruby-on-rails-3

我正在使用以下宝石和ruby-1.9.3-p194:

  • 轨道3.2.3

  • rspec-rails 2.9.0

  • spork 1.0.0rc2

  • 警卫队0.6.1

Gemfile.lockGemfile中提供了已使用gems的完整列表.

我正在使用此配置文件:

如果我修改任何模型(或app/validators等等中的自定义验证器)重新加载代码不起作用.

我的意思是当我运行规格(在防守控制台上按Enter键)Spork包含"旧代码",我得到过时的错误消息.但是当我手动重启Guard和Spork(CTRC-C CTRL-d后卫)时,一切正常.但几次后它已经累了.

问题:

有人可以看看我的配置文件并修复阻止更新代码的错误.

或者这可能是最新Rails版本的问题?


PS这个问题在一些项目中重复并重复(在某些项目上).但我还没弄清楚为什么会发生这种情况.

PS2也许这个问题与此有关ActiveAdmin?当我在app/admin代码中更改文件时重新加载.

not*_*ere 8

解决方法:

# config/environments/test.rb
config.cache_classes = false
Run Code Online (Sandbox Code Playgroud)

但这是"双刃剑".

规格现在运行时间延长了2.0倍.但它仍然比一次又一次重启Spork更快.


更新于28.06.2013

使用宙斯.它完美地运作.基准位于底部..

如果你正在使用1.9.3考虑安装特殊的补丁,真正加快加载应用程序.

RVM补丁集

rbenv说明

背景与基准:

我有一个非常大的1.9.3应用程序,我想加速应用程序加载,Spork不工作,所以我开始寻找其他解决方案:

我写了一个空的规范,看看加载我的应用需要多长时间

- /规格/ empty_spec.rb

require 'spec_helper'

describe 'Empty' do

end
Run Code Online (Sandbox Code Playgroud)

平原1.9.3

time rspec spec/empty_spec.rb 64,65s user 2,16s system 98% cpu 1:07,55 total

1.9.3 + rvm补丁集

time rspec spec/empty_spec.rb 17,34s user 2,58s system 99% cpu 20,047 total

1.9.3 + rvm patchsets + zeus

time zeus test spec/empty_spec.rb 0,57s user 0,02s system 58% cpu 1,010 total [w00t w00t!]


Ser*_*sev 7

或者,您可以为模型,控制器和其他代码添加防护.当任何这些文件发生变化时,它会使警卫重新加载spork.

guard 'spork',
      :rspec_env => {'RAILS_ENV' => 'test'} do
  watch(%r{^app/models/(.+)\.rb$})
  watch(%r{^lib/(.+)\.rb$})
end
Run Code Online (Sandbox Code Playgroud)

  • 是.:)重新加载Spork需要大约20-30秒(在我的电脑上).我通常运行单一规格(当我在重构时进行模型更改等). (2认同)

yel*_*waj 5

我有同样的问题.重新加载测试并成功运行以更改model_spec.rb.当我对model.rb文件进行更改时,重新运行了测试,但代码似乎被缓存 - 因此未应用更改.

它需要一些答案的组合才能使事情顺利进行:

# /config/environments/test.rb
config.cache_classes = !(ENV['DRB'] == 'true')

# spec_helper.rb
Spork.each_run do
  .....
  ActiveSupport::Dependencies.clear
end
Run Code Online (Sandbox Code Playgroud)

我还将spork更新为(1.0.0rc3)并用spork-rails替换了spork gem,如上面的@ 23inhouse所述.但是,我没有看到gemfile中的任何一个gem之间有任何区别,尽管升级spork可能会产生影响.

希望这有助于其他人不再花费更多时间撞到墙上.