По какой-то необъяснимой причине RubyMine автоматически сохраняет каждое вносимое вами изменение, поэтому каждое нажатие клавиши запускает Guard для запуска ваших тестов! И самое смешное, что отключить эту "фичу" автосохранения, видимо, никак нельзя. Мне просто интересно, RubyMine кажется очень популярным редактором среди разработчиков Rails, а Guard кажется незаменимым инструментом, используемым для автоматизации тестирования. Поскольку Guard невозможно разумно использовать с RubyMine, как люди справляются с автоматизацией своих тестов с помощью RubyMine?
Нельзя ли использовать Guard с RubyMine?
Ответы (5)
Я использую RubyMine с Guard весь день, и на самом деле некоторые части Guard были разработаны в самом RubyMine.
Вы можете настроить автоматическое безопасное поведение, выбрав RubyMine > Preferences
в меню и введя sync
в поле поиска, затем выбрав System Settings
из списка.
На картинке показаны мои настройки, и они отлично работают. Вы также можете отключить 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:
Наслаждаться!
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
rbenv which guard
, чтобы получить специфичный для rbenv путь для защиты.
- person aks; 16.10.2016
Когда вы запускаете 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. Кто-нибудь хочет прокомментировать преимущества этого? Я думаю, было бы неплохо иметь кликабельный дамп стека.
locate \*/bin/guard
, так как это простой способ отобразить все установки двоичного файла защиты в вашей системе :)
- person Steve Benner; 18.11.2013
Это действительно неприятная проблема, из-за которой очень сложно использовать RubyMine с охранником, ворчанием или другими исполнителями задач.
Я придумал немного сумасшедший обходной путь, но он работает достаточно хорошо для меня:
- Добавьте внешний инструмент для запуска почтенной Unix-команды «touch», которая обновляет измененную временную метку файла, тем самым генерируя событие файловой системы. Это должно выглядеть так:
- Назначьте внешнему инструменту сочетание клавиш.
- Назначьте сочетание клавиш для команды «Сохранить документ».
- Запишите макрос, который запускает «Сохранить документ», а затем «коснитесь» внешнего инструмента. Вам необходимо использовать назначенные вами сочетания клавиш, поскольку пункт «Сохранить документ» не отображается в меню приложения.
- Назначьте Cmd-S в качестве сочетания клавиш для вашего нового макроса.
Мой полный пост об этом в блоге находится по адресу http://singlebrook.com/blog/saving-files-in-rubymine
Или вы можете добавить файл run_guard.rb в корень вашего проекта со следующим кодом:
exec 'guard'
Осторожно! У Rubymine проблема с вашим PATH. Например, /usr/local/bin фильтруется...