16

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

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

Есть ли способ сделать Rails перезагрузить плагин во время разработки, как он перезагружает ваши модели и контроллеры?

+0

Имея такую ​​же проблему. Текущие ответы либо неприемлемы для меня, либо они не работают. – drewrobb

ответ

1

Если перезапуск сервера автоматически при изменении кода плагина является приемлемым решением, вы можете использовать Mike Clark/topfunky's rstakeout для этого или более новый watchr, который звучит так, как будто он делает то же самое.

Вы бы сделать что-то вроде этого:

rstakeout 'touch tmp/restart.txt' 'vendor/plugins/**/*' 
+1

Охрана также является хорошее решение для просмотра файлов для изменений. Плагин охранника-пассажира перезапускает сервер при изменении файлов: https://github.com/mordaroso/guard-passenger – Kris

1

Легкий способ, разработать плагин в папку внутри "приложение" папки:

  • приложение
    • модели
    • контроллеры
    • хелперы
    • просмотров
    • your_plugin_here

Таким образом, все ваши классы плагин будет перезагружен по каждому запросу.

Другая возможность заключается в том, чтобы добавить путь в вашем application.rb файле:

require File.expand_path('../boot', __FILE__) 
require 'rails/all' 
Bundler.require(:default, Rails.env) if defined?(Bundler) 

module SunspotTutorial 
    class Application < Rails::Application 

    config.autoload_paths += %W{ #{config.root}/plugins/your_plugin_name/lib } 

    #lots of other code 
    end 
end 

Таким образом, ваш плагин будет перезагружен все время.

+0

thats, к чему я прибегал, но это не похоже на лучшее решение – msaspence

+0

какое решение вы хотите? –

+0

Если способ, который не просит вас ничего конфигурировать и просто работает, не лучшее решение, у меня нет идей. –

3

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

gem install shotgun

cd /path/to/rails/app

shotgun

медленное время отклика, но перезарядка весь код рельсы, а не тратить время, чтобы написать autoload_paths

+0

Моя черт возьми, это потрясающе. Спасибо. –

9

я боролся с этим в течение некоторого времени, слишком. Ни одно из решений не работает, включая autoload_paths и autoload_once_paths трюки. Кроме того, взлом с FileUpdateChecker и инициализаторами также не помогает (шашка запускается правильно, но файлы не перезагружаются). То же самое для config.reload_plugins = true ...

Однако есть решение. В app/controllers/application_controller.rb добавить одну строку: require_dependency 'your_file_name_here' Контроллер приложения является перезагружаются при каждом запросе и require_dependency делает ваш файл будет проверяться на наличие изменений и перезагружается соответственно. Это сработало для меня, Apache 2, Passenger 3 и Rails 3.0.3.

+0

На второй проход для меня работает config.reload_plugins = true. – drewrobb

+0

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

+0

Я подозреваю, что reload_plugins не работает, потому что предположительно у меня установлены файлы неправильно, и они не загружаются по рельсам автоматически, требуя вместо этого инструкции «require». http://stackoverflow.com/questions/1073076/rails-lib-modules-and –

0

Это решение, для двигателей, работает на Rails 2.3, но поставляется с одним cavaet, это будет загружать все файлы в движке и родительском приложении по каждому запросу, что сделает время ответа медленнее.

# lib/my_engine/engine.rb 
if ENV['RELOAD_MYENGINE'] && Rails.env.development? 
    config.to_prepare do 
    Rails.logger.debug "RELOADING MY ENGINE" 
    require_dependency MyEngine::Engine.root.join('lib', 'my_engine').to_s 
    end 

config.after_initialize do 
    Rails.application.config.reload_classes_only_on_change = false 
end 

Затем запустите сервер:

RELOAD_MYENGINE=1 rails server 
Смежные вопросы