【问题标题】:Is it impossible to use Guard with RubyMine?是否无法将 Guard 与 RubyMine 一起使用?
【发布时间】:2012-08-16 22:06:49
【问题描述】:

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

【问题讨论】:

  • 有一个未解决的问题:youtrack.jetbrains.com/issue/RUBY-9903
  • 我个人宁愿完全没有自动保存。有时,尤其是使用 vim 笔画时,您可能会在切换到另一个文件时错误地在当前文件的某处添加一个额外的字符而没有注意到。通常测试会捕捉到这一点,但有一次在 .js 文件中,我在最后部署了一个附加的“z”,直到进行跨浏览器测试,IE 才发现它。
  • @Dave 我认为 yiinewbie 的意思不是“莫名其妙”,而是说“令人沮丧”:)

标签: ruby-on-rails rspec tdd rubymine guard


【解决方案1】:

我整天都在使用 RubyMine 和 Guard,事实上,Guard 的某些部分已经在 RubyMine 本身中开发了。

您可以通过转到菜单中的RubyMine > Preferences 并在搜索框中输入sync,然后从列表中选择System Settings 来配置自动安全行为。

图片显示了我的设置,这些工作正常。您可能还想禁用Save files on frame deactivation,以便仅在手动保存时保存文件。

我更喜欢从终端使用 Guard,但您可以通过从菜单中选择 Run > Edit configurations 添加一个运行配置来配置 RubyMine 以直接运行 Guard:

现在您可以通过单击加号 + 并选择 IRB console 来添加新配置:

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

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

接下来,您需要检查Bundler 选项卡中的Run the script in the bundle 的上下文

现在按OK,您就有了全新的运行配置。在启动 Guard 之前,您应该通过添加将交互器配置为简单

interactor :simple

到您的Guardfile。现在您可以直接在 RubyMine 中运行(甚至调试)Guard:

享受吧!

【讨论】:

  • 这是一个非常详细的答案:)
  • @alecmce 您应该 add proper Readline support 安装您的 Ruby。
  • 确认这仍然适用于 Rubymine 6 和最新的保护 gem。很棒的答案。
  • 这仍然适用于 RubyMine 7。我只想补充一点,对于那些使用 RBEnv which guard 将返回 RBEnv 使用的 shim/wrap/alias 的路径,你必须检查你的 gems 文件夹找到正确的保护脚本,它是实际的 ruby​​ 代码。就我而言,(ruby)保护脚本位于:~/.rbenv/versions/<some_ruby_version>/lib/ruby/gems/1.9.1/gems/guard-1.0.3/bin/guard
  • 使用 rbenv which guard 获取 rbenv 特定的路径来保护。
【解决方案2】:

当您使用 RubyMine 运行保护进行测试时,为保护规范配置单独的数据库环境非常有用,否则您会遇到奇怪的问题(一个进程或另一个进程冻结或给出不一致的结果。

将您的保护规范环境命名为“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 running specs 真的很棒,因为您会发现失败的测试比尝试在 RubyMine 中自己运行测试要快得多。即,测试基本上是在我的手指从 cmd-s 释放以保存时完成的。

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

【讨论】:

  • 我喜欢使用locate \*/bin/guard,因为它是显示系统中所有二进制保护文件安装的简单方法:)
  • 我不知道为什么,但这为我解决了一堆 I/O 和 sqlite 锁定异常。
【解决方案3】:

这是一个非常令人沮丧的问题,并且很难将 RubyMine 与 guard、grunt 或其他任务运行器一起使用。

我创造了一些疯狂的解决方法,但它对我来说已经足够好了:

  1. 添加一个外部工具来运行古老的 Unix“触摸”命令,该命令更新文件的修改时间戳,从而生成文件系统事件。它应该如下所示:
  2. 为外部工具分配键盘快捷键。
  3. 为“保存文档”命令分配键盘快捷键。
  4. 录制运行保存文档的宏,然后是“触摸”外部工具。您需要使用您指定的键盘快捷键,因为保存文档不会出现在应用程序的菜单中。
  5. 将 Cmd-S 指定为新宏的键盘快捷键。

我的完整博客文章位于http://singlebrook.com/blog/saving-files-in-rubymine

【讨论】:

    【解决方案4】:

    或者您可以使用以下代码在项目的根目录中添加一个 run_guard.rb 文件:

    exec 'guard'
    

    小心! Rubymine 的 PATH 有问题。比如过滤/usr/local/bin ...

    【讨论】:

      【解决方案5】:

      我将它作为Gem 命令运行,它允许我同时利用 Bundler,因此 Guard 的版本对于项目是正确的。

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 1970-01-01
        • 2018-04-13
        • 2021-07-17
        • 2012-11-08
        • 1970-01-01
        • 2019-08-27
        • 2017-03-07
        • 2013-07-30
        相关资源
        最近更新 更多