Подтвердить что ты не робот

Как я могу заставить мой плагин перезагружаться с каждым запросом?

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я тоже борется с этим в течение некоторого времени. Ни одно из решений не работает, включая трюки 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.

Ответ 3

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

gem install shotgun

cd /path/to/rails/app

shotgun

медленнее время отклика, но перезагружает весь код рельсов, не теряя времени на запись autoload_paths

Ответ 4

Простой способ, создайте свой плагин в папке внутри папки "app":

  • приложение
    • Модели
    • Контроллеры
    • Помощники
    • вид
    • 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

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

Ответ 5

С https://github.com/ranmocy/guard-rails, это очень просто:

# Gemfile.local
gem 'guard-rails'


$ bundle
$ guard init rails


# Guardfile:
guard 'rails' do
  watch('Gemfile.lock')
  watch(%r{^(config|plugins)/.*})
end


$ bundle exec guard

Ответ 6

Это решение для движков работает на 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