Нельзя ли использовать Guard с RubyMine?

По какой-то необъяснимой причине RubyMine автоматически сохраняет каждое вносимое вами изменение, поэтому каждое нажатие клавиши запускает Guard для запуска ваших тестов! И самое смешное, что отключить эту "фичу" автосохранения, видимо, никак нельзя. Мне просто интересно, RubyMine кажется очень популярным редактором среди разработчиков Rails, а Guard кажется незаменимым инструментом, используемым для автоматизации тестирования. Поскольку Guard невозможно разумно использовать с RubyMine, как люди справляются с автоматизацией своих тестов с помощью RubyMine?


person yiinewbie    schedule 16.08.2012    source источник
comment
Для этого есть открытый вопрос: youtrack.jetbrains.com/issue/RUBY-9903.   -  person CrazyCoder    schedule 17.08.2012
comment
Лично я бы предпочел вообще без автосохранения. Иногда, особенно с vim штрихами, вы можете по ошибке добавить лишний символ где-то в текущем файле при переключении на другой и не заметить. Обычно тесты улавливают это, но один раз в файле .js я развернул добавленный z в самом конце и не улавливал его, пока не провел кросс-браузерное тестирование, из-за чего IE его вырвало.   -  person Ted    schedule 08.02.2013
comment
@ Дэйв, я думаю, вместо необъяснимого yiinewbie хотел сказать разочаровывающий :)   -  person Jared Beck    schedule 11.11.2014


Ответы (5)


Я использую RubyMine с Guard весь день, и на самом деле некоторые части Guard были разработаны в самом RubyMine.

Вы можете настроить автоматическое безопасное поведение, выбрав RubyMine > Preferences в меню и введя sync в поле поиска, затем выбрав System Settings из списка.

Настроить автоматическое безопасное поведение RubyMine

На картинке показаны мои настройки, и они отлично работают. Вы также можете отключить Save files on frame deactivation, чтобы сохранять файл только при ручном сохранении.

Я предпочитаю использовать Guard из терминала, но вы можете настроить RubyMine для запуска Guard напрямую, добавив Конфигурацию запуска, выбрав Run > Edit configurations в меню:

Теперь вы можете добавить новую конфигурацию, нажав на плюсик + и выбрав IRB console:

Добавить новую конфигурацию запуска

Теперь назовите конфигурацию Guard, введите путь к Guard в скрипт IRB и задайте рабочий каталог проекта. Вы можете ввести свои аргументы Guard в качестве аргументов IRB, например разные группы Guard и т. д.

Настроить конфигурацию запуска

Я нашел свой путь к Guard, открыв терминал, перейдя в рабочий каталог проекта и введя which guard, что приводит к /Users/michi/.rvm/gems/ruby-1.9.3-p194/bin/guard для моего Ruby 1.9.3-p194 SDK, управляемого RVM.

Затем вам нужно установить флажок Запустить скрипт в контексте пакета на вкладке Bundler.

Запуск с исполняемым пакетом

Теперь нажмите OK, и у вас будет совершенно новая конфигурация запуска. Перед запуском Guard необходимо настроить интерактор на простой, добавив

interactor :simple

к вашему Guardfile. Теперь вы можете запускать (или даже отлаживать) Guard прямо в RubyMine:

Страж в действии

Наслаждаться!

person Netzpirat    schedule 17.08.2012
comment
Это потрясающе подробный ответ :) - person grosser; 20.08.2012
comment
Большое спасибо! По какой-то причине сохранение моих файлов в RubyMine не запускает защиту для повторного запуска моих тестов. Есть идеи, почему? - person alecmce; 22.12.2012
comment
@alecmce Вы должны добавьте правильную поддержку Readline в вашу установку Ruby. - person Netzpirat; 26.12.2012
comment
@Netzpirat Спасибо за это ... к сожалению, после установки Readline теперь ни RubyMine, ни командная строка не работают правильно :-/ Теперь я могу запускать только все тесты ... - person alecmce; 03.01.2013
comment
@alecmce Вы установили правильную библиотеку уведомлений файловой системы, как описано в эффективной обработке файловой системыраздел? - person Netzpirat; 03.01.2013
comment
@Netzpirat Большое спасибо. Я испортил зависимость (и, как это бывает, у меня также был сбой rvm). Я относительно новичок в Ruby, и этот пост и ваши комментарии мне очень помогли. - person alecmce; 03.01.2013
comment
@Netzpirat Отличный ответ. Я бы посоветовал также установить флажок «Только один экземпляр», чтобы убедиться, что экземпляр Guard запускается только один раз. В противном случае с базой данных и другими побочными эффектами все может стать очень грязным. - person Sim; 27.10.2013
comment
@alecme правильная ссылка на добавить правильная поддержка Readline - person max; 12.11.2013
comment
Подтверждаем, что это все еще работает с Rubymine 6 и самым последним геммом защиты. Потрясающий ответ. - person Amal Chaudhuri; 16.03.2014
comment
есть ли способ избежать абсолютного пути в «скрипте IRB»? - person ironic; 17.10.2014
comment
Это все еще работает для RubyMine 7. Я просто хочу добавить, что для тех, кто использует RBEnv which guard, будет возвращаться путь для прокладки / обертки / псевдонима, который использует RBEnv, вам нужно проверить папку с драгоценными камнями, чтобы найти правильный защитный скрипт, который является настоящим ruby код. В моем случае (рубиновый) защитный скрипт находился в: ~/.rbenv/versions/<some_ruby_version>/lib/ruby/gems/1.9.1/gems/guard-1.0.3/bin/guard - person damianmr; 06.01.2015
comment
Используйте rbenv which guard, чтобы получить специфичный для rbenv путь для защиты. - person aks; 16.10.2016
comment
Этот ответ, похоже, не работает для меня, я все еще получаю изменение одного символа в моем файле спецификаций без автоматического запуска Guard, я бы хотел, чтобы он просто запускался, когда я нажимал Ctrl + S, чтобы сохранить мои изменения. - person David Cruwys; 08.08.2017
comment
Я использую simplecov и хочу, чтобы покрытие кода было интегрировано в rubymine. Как мне настроить Guard и Rubymine, чтобы они постоянно обновляли то, что защищено rubymine? - person David West; 20.10.2017

Когда вы запускаете Guard с RubyMine для тестов, крайне полезно настроить отдельную среду базы данных для спецификации Guard, иначе вы столкнетесь со странными проблемами (один процесс или другой зависнет или даст противоречивые результаты.

Назовите среду спецификации защиты «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. Кто-нибудь хочет прокомментировать преимущества этого? Я думаю, было бы неплохо иметь кликабельный дамп стека.

person justingordon    schedule 29.10.2012
comment
Мне нравится использовать locate \*/bin/guard, так как это простой способ отобразить все установки двоичного файла защиты в вашей системе :) - person Steve Benner; 18.11.2013
comment
Я понятия не имею, почему, но это решило для меня кучу исключений блокировки ввода-вывода и sqlite. - person Joe Essey; 01.09.2014

Это действительно неприятная проблема, из-за которой очень сложно использовать RubyMine с охранником, ворчанием или другими исполнителями задач.

Я придумал немного сумасшедший обходной путь, но он работает достаточно хорошо для меня:

  1. Добавьте внешний инструмент для запуска почтенной Unix-команды «touch», которая обновляет измененную временную метку файла, тем самым генерируя событие файловой системы. Это должно выглядеть так: Внешний инструмент под названием touch
  2. Назначьте внешнему инструменту сочетание клавиш.
  3. Назначьте сочетание клавиш для команды «Сохранить документ».
  4. Запишите макрос, который запускает «Сохранить документ», а затем «коснитесь» внешнего инструмента. Вам необходимо использовать назначенные вами сочетания клавиш, поскольку пункт «Сохранить документ» не отображается в меню приложения.
  5. Назначьте Cmd-S в качестве сочетания клавиш для вашего нового макроса.

Мой полный пост об этом в блоге находится по адресу http://singlebrook.com/blog/saving-files-in-rubymine

person sbleon    schedule 15.06.2015

Или вы можете добавить файл run_guard.rb в корень вашего проекта со следующим кодом:

exec 'guard'

Осторожно! У Rubymine проблема с вашим PATH. Например, /usr/local/bin фильтруется...

person jmgarnier    schedule 10.10.2012

Я запускаю его как команду Gem, которая одновременно позволяет мне подключаться к Bundler, поэтому версия Guard подходит для проекта.

Я запускаю его как команду Gem

person Ikon    schedule 07.10.2020