Как заставить мой плагин перезагружаться при каждом запросе? - PullRequest
16 голосов
/ 17 января 2011

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

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

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

Ответы [ 6 ]

9 голосов
/ 02 февраля 2011

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

Я делаю это с помощью самоцвета дробовика.

gem install shotgun

cd /path/to/rails/app

shotgun

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

2 голосов
/ 17 января 2011

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

  • 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

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

1 голос
/ 06 апреля 2011

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

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

rstakeout 'touch tmp/restart.txt' 'vendor/plugins/**/*'
0 голосов
/ 29 мая 2015

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

# 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
0 голосов
/ 20 июня 2014

С 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
...