Использование Guard для автоматизации процессов разработки

Illustration of a person sitting against a wall engrossed in reading a book, with attention to details like orange sneakers and a scarf, on a dual-tone background. Illustration of a person sitting against a wall engrossed in reading a book, with attention to details like orange sneakers and a scarf, on a dual-tone background.

Если вы уже имели опыт работы с тестами в Rails-приложении, то заметили, что для их запуска надо постоянно обращаться к консоли, отвлекаясь от процесса написания кода. Гораздо удобнее было бы, если бы тесты запускались автоматически по ходу изменения кода приложения. Есть целый ряд инструментов, решающих эту задачу, но мы рассмотрим только один из них – Guard. Разберем что это такое и зачем оно нужно нам, разработчикам на Ruby On Rails.

Guard

Guard нужен для автоматизации процессов. Он просматривает файлы и при их изменении автоматически выполняет различные задачи, например, запускает тесты, перезагружает development сервер, обновляет страницу в браузере и многое другое.

Guard следит за изменениями в вашем проекте и, после их сохранения, выполняет те экшны которые были модифицированы. Большим плюсом является то, что Guard имеет множество плагинов для различных технологий, например RSpec, Cucumber, Minitest и др. Полный список расширений находится на странице гема.

Установка

Установку проще всего проводить так же как и со всеми гемами – прописать в Gemfile нужные гемы. Можно не прописывать сам guard, потому что он все равно установится как зависимость других гемов.

Прописываем Guard для RSpec в Gemfile:

  group :development, :test do
    gem 'guard-rspec'
  end

и затем устанавливаем это с помощью bundle install.

Инициализация

После установки инициализируем Guard для работы с RSpec: bundle exec guard init rspec (если используете rvm, то можно не писать bundle exec).

После выполнения инициализации в нашем проекте появится Guardfile – файл конфигурации Guard (как конфигурировать его очень подробно объяснено в документации).

Я добавил в свой конфиг следующие строчки, чтобы при изменении контроллера или вьюхи сразу же проверялся соответствующий спек.

    watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m|
      ["spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
       (m[1][/_pages/] ? "spec/requests/#{m[1]}_spec.rb" :
                   "spec/requests/#{m[1].singularize}_pages_spec.rb")]
    end
    watch(%r{^app/views/(.+)/}) do |m|
      (m[1][/_pages/] ? "spec/requests/#{m[1]}_spec.rb" :
                  "spec/requests/#{m[1].singularize}_pages_spec.rb")
    end

Запуск

Guard запускается простой командой bundle exec guard (или просто guard если вы используете rvm или уже настроили свое окружение на работу без ввода bundle exec)

И теперь при сохранении изменений вы будете видеть сразу проходят ли соответствующие тесты.

livereload

Так же мы можем менять внешнее представление приложения (html/css) с последующим автоматическим обновлением страницы в браузере. Устанавливаем его так же, как и все остальные гемы – прописываем в Gemfile. Настройки производятся в Guardfile (тут можно почитать про опции подробнее https://github.com/guard/guard-livereload). Обязательно надо будет установить расширение Livereload в браузер в котором вы работаете.


Guard позволяет автоматизировать рутинные процессы при разработке. Автоматический прогон тестов и перезагрузка страницы в браузере – лишь малая часть из возможных вариантов использования. Предлагаю обратиться к документации Guard и найти применение гема для своих нужд.