ruby-on-rails - novedades - ruby on rails official website
¿Cómo puedo forzar mi complemento para que se cargue con cada solicitud? (6)
Con https://github.com/ranmocy/guard-rails , es muy fácil:
# Gemfile.local
gem ''guard-rails''
$ bundle
$ guard init rails
# Guardfile:
guard ''rails'' do
watch(''Gemfile.lock'')
watch(%r{^(config|plugins)/.*})
end
$ bundle exec guard
Según tengo entendido, los complementos no se vuelven a cargar en Rails con cada solicitud en modo de desarrollo. Lo que tiene sentido, ya que generalmente agregas complementos a tu aplicación y es la aplicación que estás desarrollando.
Pero si está desarrollando un complemento, debe reiniciar el servidor con cada cambio en el complemento que tiene una sobrecarga significativa.
¿Hay alguna forma de hacer que Rails vuelva a cargar su complemento durante el desarrollo, la forma en que vuelve a cargar sus modelos y controladores?
De manera sencilla, desarrolle su complemento en una carpeta dentro de la carpeta "app" :
- aplicación
- modelos
- controladores
- ayudantes
- puntos de vista
- tu_plugin_aquí
De esta manera, todas sus clases de complementos se volverán a cargar en cada solicitud.
Otra posibilidad es agregar la ruta en el archivo 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
De esta manera tu plugin será recargado todo el tiempo.
Esta solución, para motores, funciona en Rails 2.3 pero viene con un cavaet, cargará todos los archivos en el motor y la aplicación principal en cada solicitud, lo que hará que los tiempos de respuesta sean más lentos.
# 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
A continuación, inicie el servidor:
RELOAD_MYENGINE=1 rails server
Hago esto usando la gema escopeta.
gem install shotgun
cd /path/to/rails/app
shotgun
tiempo de respuesta más lento, pero recargando todos los códigos de rieles, sin perder tiempo para escribir autoload_paths
También he estado luchando con esto por algún tiempo. Ninguna de las soluciones funciona, incluidos los trucos autoload_paths
y autoload_once_paths
. Además, el truco con FileUpdateChecker
y los inicializadores tampoco ayuda (el verificador se activa correctamente, pero los archivos no se vuelven a cargar). Lo mismo para config.reload_plugins = true
...
Sin embargo, hay una solución. En app/controllers/application_controller.rb
agregue una línea: require_dependency ''your_file_name_here''
El controlador de la aplicación se require_dependency ''your_file_name_here''
cargar en cada solicitud y require_dependency
hace que su archivo se revise en busca de modificaciones y se recargue en consecuencia. Funcionó para mí, Apache 2, Passenger 3 y Rails 3.0.3.
Si reiniciar el servidor automáticamente cuando se modifica el código del complemento es una solución aceptable, puede usar el rstakeout de Mike Clark / rstakeout
para eso, o la nueva watchr
que parece que hace lo mismo.
Harías algo como esto:
rstakeout ''touch tmp/restart.txt'' ''vendor/plugins/**/*''