Невъзможно ли е да използвате 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
@Dave Мисля, че вместо необяснимо, yiinewbie искаше да каже разочароващо :)   -  person Jared Beck    schedule 11.11.2014


Отговори (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.

Изпълнение с bundle exec

Сега натиснете OK и имате чисто нова конфигурация за изпълнение. Преди да стартирате Guard, трябва да конфигурирате интерактора на прост чрез добавяне

interactor :simple

на вашия Guardfile. Сега можете да стартирате (или дори да отстраните грешки) Guard директно в RubyMine:

Гвардия в действие

Наслади се!

person Netzpirat    schedule 17.08.2012
comment
Това е страхотно подробен отговор :) - person grosser; 20.08.2012
comment
Страхотно благодаря! По някаква причина запазването на моите файлове в RubyMine не задейства guard да повтори моите тестове. Някаква идея защо? - 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
Ако искате също така да коригирате проблема с обърнатия цвят, вижте: stackoverflow. com/questions/16392264/ - person Dan K.K.; 05.11.2013
comment

Опитайте да използвате следното:

String str = "This is a simple sentence";
String[] strgs = str.split(" ");

Това ще създаде подниз на всеки индекс на масива от низове, използвайки интервала като точка на разделяне.

- 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 ще върне пътя за shim/wrap/alias, който RBEnv използва, трябва да прегледате папката си с скъпоценни камъни, за да намерите правилния скрипт за защита, който е действително ruby код. В моя случай скриптът (ruby) guard беше в: ~/.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
Нямам представа защо, но това реши куп I/O и sqlite заключващи изключения за мен. - person Joe Essey; 01.09.2014

Това е наистина разочароващ проблем и прави много трудно използването на RubyMine с guard или grunt или други задачи.

Създадох малко лудо решение, но работи достатъчно добре за мен:

  1. Добавете външен инструмент, за да изпълните почтената команда Unix "touch", която актуализира модифицирания времеви печат на файл, като по този начин генерира събитие на файловата система. Трябва да изглежда така: Външен инструмент, наречен touch
  2. Задайте на външния инструмент клавишна комбинация.
  3. Задайте клавишна комбинация на командата Записване на документ.
  4. Запишете макрос, който изпълнява Save Document, след това външния инструмент "touch". Трябва да използвате клавишните комбинации, които сте задали, защото Save Document не се показва в менютата на приложението.
  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 команда, която alto ми позволява да се докосна до Bundler едновременно, така че версията на Guard да е правилна за проекта.

Изпълнявам го като команда Gem

person Ikon    schedule 07.10.2020