Guard не видит обновления файлов

Я разрабатываю собственный движок, используя эту настройку.

Я создал двигатель с

rails plugin new MyEngine --full

Затем я добавил rspec-rails и guard-rspec в качестве зависимостей разработки с помощью

s.add_development_dependency "rspec-rails"
s.add_development_dependency "guard-rspec"

в моем файле gemspec.

Когда я запускаю и rspec, и rake specbundle exec или без него), мои спецификации работают нормально. Однако когда я запускаю команду guard, она запускает все спецификации в первый раз, а затем ничего не делает. Он не обнаружит никаких изменений файлов во всем приложении.

Guardfile генерируется как обычно с помощью guard init spec, вот его содержимое

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard 'rspec', :version => 2 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$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec/" }
  watch('spec/spec_helper.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

Если я оставлю оболочку открытой с запущенной защитой и сделаю это из другой оболочки touch app/my_model.rb, ничего не произойдет. То же самое для любого другого файла (шаблона), указанного в Guardfile.

Есть ли способ отладить такие проблемы?

Обновление Я создал новый проект (rails) и установил guard-shell драгоценный камень с этим Guardfile

guard 'shell' do
  watch(%r{(.*)}) {|m| `cat #{m[0]}` }
  watch(%r{(.*)}) {|m| raise m.to_s }
end

Даже в этом случае, если я редактирую какие-либо файлы, ничего не происходит. Я начинаю думать, что проблема может быть где-то еще, может быть, в геме rb-fsevents. Что я могу проверить?


person Fabio    schedule 05.09.2011    source источник


Ответы (4)


Защитный файл для rspec явно не совсем правильный. Он смотрит app/controllers, но не app/models.

Вам понадобится правило вроде:

watch(%r{^app/models/(.+)\.rb$}) {|m| "spec/models/#{m[1]}_spec.rb" }

Измените 2-ю часть на то место, где хранятся спецификации ваших моделей. Прошло некоторое время с тех пор, как я использовал rspec, не могу вспомнить макет каталога спецификаций.

Редактировать:

Также странно, что lib watcher определяется дважды? Один раз наверху и один раз под рельсами. Интересно, является ли это второе определение ошибкой и должно ли оно быть правилом для app/models.

person numbers1311407    schedule 05.09.2011
comment
Вы правы, я обновлю сгенерированный файл (по умолчанию). Однако это не проблема. Смотрите мое редактирование вопроса. - person Fabio; 05.09.2011
comment
ах, понятно... вы можете запустить охрану с флагом --debug, но я предполагаю, что вы, вероятно, уже пробовали это. - person numbers1311407; 05.09.2011
comment
да, я пробовал это, спасибо. Я только что решил перезагрузку системы, см. мой ответ. - person Fabio; 06.09.2011
comment
для записей, теперь, когда все снова работает, я вижу, что любое изменение в app/models/foo.rb вызывает правильную спецификацию. Это должно быть связано с тем, что правило в Guardfile соответствует части models/foo.rb и возвращает spec/models/foo_spec.rb. - person Fabio; 06.09.2011
comment
Теперь это имеет смысл, снова взглянув на регулярное выражение и зная, что настоящая причина проблемы была не в сопоставителе. Меня бросили, так как вы упомянули, что модели не работают, а инициированные правила для теста/модуля do разделяют модели/контроллеры. Разные авторы, наверное. - person numbers1311407; 06.09.2011

Ок, не знаю в чем дело, но проблема была в fseventd, который каким-то образом был заморожен.

Запуск Guard без решил проблему, так что проблема была не в самой Guard.

> guard
Please install rb-fsevent gem for Mac OSX FSEvents support
Using polling (Please help us to support your system better than that.)
Please install growl or growl_notify gem for Mac OS X notification support and add it to your Gemfile

Более того, перезагрузка системы (не знаю, как перезапустить демон) «разблокировала» fseventd, и теперь он снова работает. Возможно, это была моя вина, потому что я не перезагружала систему больше месяца...

person Fabio    schedule 05.09.2011

В текущей версии 1.2.2 также, кажется, есть ошибка, которая показала те же симптомы, что и вы описали в моей среде. Обновление до 1.2.3 помогло.

person csch    schedule 03.07.2012

В моем случае Guard работает изначально. Затем я создал символическую ссылку на каталог, который он просматривает. Он остановился.

Предположим, он смотрит «источник/пример». Я создал символическую ссылку как "source/link_me" -> "source/example". Охранник тоже молчал.

person chfw    schedule 08.04.2014