2017-02-02 30 views
1

Я отлаживаю приложение rails (Redmine), и каждый раз, когда я что-то изменяю в маршрутах или библиотеке плагинов, которые исправляют базовый класс, я должен перезапустить рельсы, даже если его в режиме разработки с отключенным кешированием. .Приложение отладки Rails без перезагрузки

Это как мой сервер выглядит следующим образом:

rails s 
=> Booting WEBrick 
=> Rails 3.2.16 application starting in development on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
[2017-02-02 17:06:18] INFO WEBrick 1.3.1 
[2017-02-02 17:06:18] INFO ruby 2.1.8 (2015-12-16) [x86_64-darwin15.0] 
[2017-02-02 17:06:18] INFO WEBrick::HTTPServer#start: pid=12042 port=3000 

кто-нибудь знает, как заставить приложение частично перезагрузить классы, которые были затронуты или с таким изменением или?

+0

Некоторые аспекты приложения Rails выполняются или интерпретируются только при запуске сервера, например инициализаторы и прочее. – MurifoX

ответ

2

Возможно, вы загрузили исправления из файла init.rb вашего плагина Redmine. Это хорошая практика, чтобы окружить их:

ActionDispatch::Reloader.to_prepare

Используя эту функцию обратного вызова, патчи будут повторно применены перед каждым запросом в режиме разработки.

Вот пример:

require 'redmine' 
ActionDispatch::Reloader.to_prepare do 
    require_dependency 'redmine_multiprojects_issue/issue_patch' 
    require_dependency 'redmine_multiprojects_issue/issues_helper_patch' 
    require_dependency 'redmine_multiprojects_issue/issues_controller_patch' 
end 
Redmine::Plugin.register :redmine_multiprojects_issue do 
    ... 
end 

Обратите внимание, что вам все равно придется перезапустить сервер, если изменить маршруты.

+0

ах да! Я искал этот обратный вызов, но не мог вспомнить, как его называли! – phoet

+0

Но будет ли это причиной замедления и ненужной перезагрузки в производстве? Должен ли я использовать его только во время разработки? –

+2

Это красота использования этого обратного вызова - блок будет вызываться только один раз в рабочем режиме, так как перезагрузка кода Rails отключена, но он будет вызываться каждый раз, когда код перезагружается в режиме разработки. Есть несколько вариантов этого, я недавно использовал 'Rails.configuration.to_prepare do', работает то же самое. – jkraemer

1

Процесс запуска занимает довольно много времени в рельсах. большая часть этого времени связана с загрузкой зависимостей драгоценных камней. если вы хотите сделать это при каждом запросе не менее, не существует несколько способов сделать это, как описано здесь:

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

1

Redmine плагинов, как правило, не Рубиновые камни, но жить в папке внутри основного приложения Rails ,

До тех пор, пока автор плагина следует нескольким лучшим правилам Rails, автозагрузка Rails должна (и будет) также работать с плагинами Redmine. Основные вещи, чтобы обратить внимание на следующие:

  • правильное именование и Пространства имен - есть подкаталоги, соответствующие модули и имена файлов, соответствующих классу/модуля они заявляют, т.е. Foo::Bar::Baz живет в lib/foo/bar/baz.rb
  • никогда не требуют вещи вручную, но пусть Rails автозагрузка все
  • быть осторожными, когда и где вы залатать вещи имеют патчи повторно применено во время автоматической перезагрузки

Если плагин автор придерживается этих правил, код плагина скорее всего, будет автоматически загружать и перезагружать. Одним из исключений является плагин init.rb, но это обычно не меняется очень часто во время разработки плагина.

На практике много плагинов Redmine ломают автоматическую загрузку из-за нарушения этих правил. При попытке перезагрузки могут возникать проблемы с автоматической перезагрузкой или даже с ошибкой приложения, в результате чего приложение отлично работает в режиме производства, но после первого успешного запроса в режиме разработки он выходит из строя.

Часто просто перестраивая код плагина в соответствии с ожиданиями Rails и устраняя требуемые утверждения, все, что требуется для решения этой проблемы.

Изменение маршрутов, объявленных плагином, потребует перезагрузки сервера, тем не менее, я не знаю, как это можно было перезагрузить автоматически с помощью Redmine.

+0

Привет, Спасибо за начальную точку ... Можете привести несколько примеров здесь. Причина в том, что я всегда требовал в init.rb, а также патч, применяемый при выполнении рельсов * to_prepare событий. – rupeshj

+0

Использование патчей в блоках 'to_prepare' - это путь. Дело в том, что вы не должны «требовать» ничего вручную. При правильном именовании и пространстве имен даже при использовании 'require_dependency' не требуется. Хотя, если вам нужно, последнее всегда лучше, так как оно не нарушит перезагрузку кода Rails. – jkraemer