Ruby on rails Rails、Minitest和Guard—为什么rb fsevent占用超过100%的CPU?

Ruby on rails Rails、Minitest和Guard—为什么rb fsevent占用超过100%的CPU?,ruby-on-rails,ruby,guard,minitest,Ruby On Rails,Ruby,Guard,Minitest,我在Rails应用程序中运行guard,测试套件(minutest)最近已停止正常工作 如果我幸运的话,它会运行所有的测试一次,也许两次。之后,即使一个小测试文件被更改,也需要很长时间才能做出响应,因此使用gem变得徒劳无益 在测试运行时,当遵循top时,我可以看到有一个ruby进程不断地占用超过100%的CPU。即使所有测试都运行了,我也没有对文件做任何更改 ruby过程是: /Users/Bodacious/.rvm/gems/ruby-2.0.0-p247@MyApp/gems/rb-f

我在Rails应用程序中运行guard,测试套件(minutest)最近已停止正常工作

如果我幸运的话,它会运行所有的测试一次,也许两次。之后,即使一个小测试文件被更改,也需要很长时间才能做出响应,因此使用gem变得徒劳无益

在测试运行时,当遵循
top
时,我可以看到有一个ruby进程不断地占用超过100%的CPU。即使所有测试都运行了,我也没有对文件做任何更改

ruby过程是:

/Users/Bodacious/.rvm/gems/ruby-2.0.0-p247@MyApp/gems/rb-fsevent-0.9.3/bin/fsevent_watch --latency 0.1 /Users/Bodaiou/Clients/MyApp
(处理31332
)在所附的屏幕截图中

Ruby 2.0.0-p247

以下是我的设置:

# Gemfile (with irrelevant gems removed)
gem 'rails', '4.0.0'
group :test do
  gem 'launchy'
  gem "mocha", require: false
  gem 'database_cleaner'
  gem 'selenium-webdriver'
  gem 'capybara-webkit' # for headless javascript tests
  gem 'timecop'
  gem "minitest-focus"
end

group :development, :test do
  gem "minitest-rails"
  gem "minitest-rails-capybara"
  gem 'zeus'
  gem 'guard'
  gem 'guard-minitest'
  gem 'factory_girl_rails'
end


# Guardfile
guard :minitest, all_on_start: false do
  # Rails 4
  watch(%r{^app/(.+)\.rb})                               { |m| "test/#{m[1]}_test.rb" }
  watch(%r{^app/controllers/application_controller\.rb}) { 'test/controllers' }
  watch(%r{^app/controllers/(.+)_controller\.rb})        { |m| "test/integration/#{m[1]}_test.rb" }
  watch(%r{^app/views/(.+)_mailer/.+})                   { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
  watch(%r{^lib/(.+)\.rb})                               { |m| "test/lib/#{m[1]}_test.rb" }
  watch(%r{^test/.+_test\.rb})
  watch(%r{^test/test_helper\.rb})                       { 'test' }

  ignore(%r{^tmp/})

end

# test_helper
ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)

require 'rails/test_help'
require 'minitest/autorun'
require 'minitest/pride'
require "minitest/rails/capybara"

require "mocha/setup"

# Sidekiq https://github.com/mperham/sidekiq/wiki/Testing
require 'sidekiq/testing'
Sidekiq::Testing.fake!

Dir[Rails.root.join('test', 'support', '*.rb')].each do |file|
  require file
end


class MiniTest::Spec
  include FactoryGirl::Syntax::Methods
  include AllTestHelper

end


class ActiveSupport::TestCase
  include FactoryGirl::Syntax::Methods
  include AllTestHelper
end

class Capybara::Rails::TestCase
  include Rails.application.routes.url_helpers 
  include Capybara::DSL
  include Capybara::Assertions
  include IntegrationTestHelper

  # Called before each Feature spec
  before :each do
  end

  # Called after each Feature spec
  after :each do
    Capybara.reset_sessions!
  end
end
创业板版本:

  • 小型试验(4.7.5)
  • 小型水豚(0.5.0)
  • 小型测试焦点(1.1.0)
  • 迷你测试元数据(0.4.0)
  • 小型测试轨道(0.9.2)
  • 小型铁轨水豚(0.10.0)
  • 活动导轨(0.1.2)
  • 摩卡咖啡(0.14.0)
  • 防护罩(2.2.4)
  • 防护装置小型试验(2.1.2)
  • rb fsevent(0.9.3)

    • 解决方案:

      我解决了这个问题,在我的Guardfile中添加了一个“忽略”语句。对于我的rails 3项目,它看起来像这样(./Guardfile):

      这似乎是guard/rspec/rails的最佳实践

      保护“忽略”信息:

      我的问题

      我在我的mac os x 10.9机器上体验到了类似的体验,使用:

      • 弹簧(1.0.0)
      • rb fsevent(0.9.3)
      • 咆哮(1.0.3)
      • rspec核心(2.14.7)
      • rspec预期(2.14.4)
      • rspec模拟(2.14.4)
      • rspec(2.14.1)
      • 防护罩rspec(4.2.0)
      • 听(2.4.0)
      • rspec导轨(2.14.0)
      • 轨道(3.2.15)
      启动guard运行我的rspec测试后,guard进程在“空闲”时跳到一个内核上的100%负载,这样持续的时间足够让我获得“永远”的资格:)

      我试着跑去防守

      • 强制投票
      • 没有“监视”语句
      • 带弹簧
      • 没有弹簧
      没有变化

      我的同事在同一个项目的linux上工作,所以他使用rb inotify而不是rb fsevent。他在空闲时没有负载(正如你对mac os的期望一样…)


      如上所述,我的解决方案是在我的Guardfile中添加一个“忽略”语句。

      谢谢-我最终得到了相同的答案。我很惊讶-我以为watch()会隐式忽略未包含的文件我一直在尝试解决这个问题!谢谢,这个答案真的很感谢!不知道为什么它会看你没有看的文件…很好的回答,谢谢!我不得不将
      vendor
      文件夹添加到列表中,因为它也可以包含很多东西。@Eleo-wird,
      .bundle
      默认情况下被忽略regexp可以重写为:
      ruby-ignore([%r{^(bin | config | db | lib | log | public | tmp)/*}])
      ignore([%r{^bin/*}, %r{^config/*}, %r{^db/*}, %r{^lib/*}, %r{^log/*}, %r{^public/*}, %r{^tmp/*}])
      
      guard 'rspec', cmd: 'spring rspec', all_after_pass: false, all_on_start: false, focus_on_failed: true do
        # Rails
        watch(%r{^spec/.+_spec\.rb$})
        ...
      end