Как я могу заставить мой плагин перезагружаться с каждым запросом?
Как я понимаю, плагины не перезагружаются в Rails с каждым запросом в режиме разработки.
Это имеет смысл, так как обычно вы добавляете плагины в свое приложение и это приложение, которое вы разрабатываете.
Но если вы разрабатываете плагин, вам нужно перезапустить сервер с каждым изменением в плагин, который имеет значительные накладные расходы.
Есть ли способ сделать Rails перезагрузить плагин во время разработки, как он перезагружает ваши модели и контроллеры?
Ответы
Ответ 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