RubyMine是否无法使用Guard?

53

由于某种莫名其妙的原因,RubyMine会自动保存您所做的每一次更改,因此每一次按键都会触发Guard运行测试!最可笑的是,显然没有办法禁用这个自动保存的“功能”。我只是想知道,RubyMine似乎是Rails开发人员中非常流行的编辑器,而Guard似乎是用于自动化测试的不可或缺的工具。由于无法合理地使用Guard与RubyMine,人们如何处理使用RubyMine自动化测试呢?


这个问题有一个开放的issue:http://youtrack.jetbrains.com/issue/RUBY-9903。 - CrazyCoder
我个人宁愿完全没有自动保存。有时,特别是在使用vim时,您可能会在切换到另一个文件时不小心在当前文件的某个地方添加一个额外的字符而没有注意到。通常测试可以捕捉到这种情况,但有一次在一个.js文件中,我追加了一个“z”在最后,直到进行跨浏览器测试时才发现它,IE无法处理它。 - Ted
@Dave,我认为yiinewbie想说的是“令人沮丧”,而不是“难以解释”的意思 :) - Jared Beck
5个回答

149

我整天都在使用RubyMine和Guard,实际上,Guard的一些部分是在RubyMine中开发的。

您可以通过进入菜单中的偏好设置并在搜索框中输入,然后从列表中选择<系统设置>来配置自动安全行为。

Configure RubyMine auto safe behavior

图片显示了我的设置,这些设置很好用。您可能还想禁用<当帧停用时保存文件>,只在手动保存时才保存文件。

我更喜欢在终端中使用Guard,但您可以通过从菜单中选择<运行>编辑配置来配置RubyMine直接运行Guard,然后添加一个运行配置

现在,您可以通过点击加号<+>并选择来添加新的配置:

Add new run configuration

现在将配置命名为,将Guard路径输入到IRB脚本中,并设置项目工作目录。您可能希望将Guard参数作为IRB参数输入,例如不同的Guard组等。

Configure the run configuration

我通过打开终端,转到项目工作目录并输入来找到Guard的路径,这将得到我的Ruby 1.9.3-p194 SDK由RVM管理的/Users/michi/.rvm/gems/ruby-1.9.3-p194/bin/guard

接下来,您需要在选项卡中勾选<在bundle上下文中运行脚本>。

Run with bundle exec

现在,点击<确定>,您就拥有了一个全新的运行配置。在开始Guard之前,应该通过添加以下内容将交互器配置为简单:

interactor :simple

将它添加到你的Guardfile中。现在你可以直接在RubyMine中运行(甚至调试)Guard:

Guard in Action

享受吧!


10
非常详细的答案,太棒了 :) - grosser
1
@alecmce 你应该为你的Ruby安装添加正确的Readline支持 - Netzpirat
2
确认这仍然适用于Rubymine 6和最新的guard gem。非常棒的答案。 - Amal Chaudhuri
6
这段话是关于在RubyMine 7中使用RBEnv时,如何找到真正的guard脚本的说明。如果你在使用RBEnv, which guard 命令会返回一个路径,但这其实是RBEnv使用的shim/wrap/alias的路径。要找到真正的guard脚本,你需要检查你的gems文件夹。对于作者来说,(ruby)guard脚本位于以下路径:~/.rbenv/versions/<some_ruby_version>/lib/ruby/gems/1.9.1/gems/guard-1.0.3/bin/guard - damianmr
2
使用 rbenv which guard 命令获取与 rbenv 相关的 Guard 路径。 - aks
显示剩余10条评论

4
当您使用RubyMine运行测试时,通过配置独立的数据库环境可以使Guard spec非常有用,否则您将遇到奇怪的问题(某个进程会冻结或给出不一致的结果)。
命名您的Guard spec环境为“ci”,并在database.yml中创建一个额外的条目。我使用“ci”进行持续自动化。
然后将以下内容放入Guardfile中。关键是:
'RAILS_ENV' => 'ci'

这是我设置的方式:

这是我的设置:

group :spec do
  guard :spork, :rspec_port => 1234, :cucumber_env => { 'RAILS_ENV' => 'ci' }, :rspec_env => { 'RAILS_ENV' => 'ci' } do
    watch('config/application.rb')
    watch('config/environment.rb')
    watch(%r{^config/environments/.+.rb$})
    watch(%r{^config/initializers/.+.rb$})
    watch('spec/spec_helper.rb')
    watch(%r{app/models/.+\.rb})
    watch(%r{app/views/.+\.haml})
    watch('Gemfile')
    watch('Gemfile.lock')
    watch('test/test_helper.rb')
  end

  # environment is 'ci'
  guard :rspec, :cli => '--drb --drb-port 1234', :version => 2, :all_after_pass => false, :notification => true, :environment => 'ci' do
    watch(%r{^spec/.+_spec.rb$})
    watch(%r{^lib/(.+).rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
    watch('spec/spec_helper.rb')  { "spec" }
  # Rails example
    watch(%r{^spec/.+_spec.rb$})
    watch(%r{^app/(.+).rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
    watch(%r{^lib/(.+).rb$})                           { |m| "spec/lib/#{m[1]}_spec.rb" }
    watch(%r{^app/controllers/(.+)_(controller).rb$})  do |m|
      ["spec/routing/#{m[1]}_routing_spec.rb",
       "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
       "spec/acceptance/#{m[1]}_spec.rb",
       "spec/requests/#{m[1]}_spec.rb"]
    end

    watch(%r{^spec/support/(.+).rb$})                  { "spec" }
    watch('config/routes.rb')                          { "spec/routing" }
    watch('app/controllers/application_controller.rb')  { "spec/controllers" }
    # Capybara request specs
    watch(%r{^app/views/(.+)/.*.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
  end
end

我接着运行。
bundle exec guard -g spec

我不介意RubyMine每60秒自动保存文件,即使这样会启动Guard,因为我的新MBP Retina运行Guard时不会明显变慢。

顺便说一下,Guard运行测试非常好,因为你可以比在RubyMine中自己运行测试更快地发现失败的测试。也就是说,当我的手指从cmd-s释放时,测试基本上已经完成了。

我从终端运行它。我还没有尝试用RubyMine运行。有人想评论一下这样做的优点吗?我想点击堆栈转储可能会很好。


我喜欢使用 locate \*/bin/guard,因为这是一种简单的方法来显示系统中二进制文件 guard 的所有安装情况 :) - Steve Benner
我不知道为什么,但这解决了我许多输入/输出和sqlite锁定异常的问题。 - Joe Essey

4
这是一个非常令人沮丧的问题,使RubyMine难以与guard、grunt或其他任务运行程序配合使用。
我想出了一个有点疯狂的解决方法,但对我来说已经足够好用了:
  1. 添加外部工具以运行Unix的“touch”命令,它会更新文件的修改时间戳,从而生成一个文件系统事件。应该像这样: External Tool called touch
  2. 为外部工具分配一个键盘快捷键。
  3. 将键盘快捷键分配给保存文档命令。
  4. 记录一个宏,运行保存文档,然后运行“touch”外部工具。你需要使用你分配的键盘快捷键,因为保存文档不会出现在应用程序的菜单中。
  5. 为你的新宏分配Cmd-S作为键盘快捷键。
我的完整博客文章在http://singlebrook.com/blog/saving-files-in-rubymine

1
您可以在项目根目录下添加一个 run_guard.rb 文件,并加入以下代码:
exec 'guard'

注意!Rubymine与您的PATH存在问题。例如,/usr/local/bin被过滤了...


0

我将其作为一个 Gem 命令运行,这也允许我同时使用 Bundler,因此 Guard 的版本与项目相对应。

I run it as a Gem command


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接