16

Según tengo entendido, los complementos no se vuelven a cargar en Rails con cada solicitud en modo de desarrollo. Lo cual tiene sentido, ya que generalmente agrega complementos a su aplicación y es la aplicación que está desarrollando.¿Cómo puedo forzar que mi complemento se vuelva a cargar con cada solicitud?

Pero si está desarrollando un complemento, debe reiniciar el servidor con cada cambio en el complemento que tiene una sobrecarga significativa.

¿Hay alguna manera de hacer que Rails vuelva a cargar su complemento durante el desarrollo, la forma en que recarga sus modelos y controladores?

+0

teniendo el mismo problema. Las respuestas actuales no son aceptables para mí o no funcionan. – drewrobb

Respuesta

1

Si reiniciar el servidor automáticamente cuando el código del complemento cambia es una solución aceptable, puede usar Mike Clark/topfunky's rstakeout para eso, o el más nuevo watchr que suena como si hiciera lo mismo.

Se podría hacer algo como esto:

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

Guard es también un buena solución para ver archivos de cambios. El complemento de guardia-pasajero reinicia el servidor cuando los archivos cambian: https://github.com/mordaroso/guard-passenger – Kris

1

manera fácil, desarrollar su plugin en una carpeta dentro de la "aplicación" carpeta:

  • aplicación
    • modelos
    • controladores
    • ayudantes
    • vistas
    • your_plugin_here

De esta manera, todas las clases de plugin se vuelve a cargar en cada solicitud.

Otra posibilidad es añadir la ruta de acceso a su 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 el plugin se va a volver a cargar todo el tiempo.

+0

eso es lo que he recurrido, pero no parece ser la mejor solución – msaspence

+0

¿qué tipo de solución quieres? –

+0

Si una forma que no le pide que configure nada y simplemente funciona no es la mejor solución, me he quedado sin ideas. –

3

Lo hago utilizando la gema de escopeta.

gem install shotgun

cd /path/to/rails/app

shotgun

lento tiempo de respuesta, pero volver a cargar todo el código rieles, no perder el tiempo para escribir autoload_paths

+0

Dios mío, esto es increíble. Gracias. –

9

he estado luchando con esto durante algún tiempo, también. Ninguna de las soluciones funciona, incluidos los trucos autoload_paths y autoload_once_paths. Además, el truco con FileUpdateChecker y los inicializadores tampoco ayudan (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 es recargado en cada solicitud y require_dependency hace que su archivo se revise para ver si hay modificaciones y se recarga en consecuencia. Me funcionó, Apache 2, Passenger 3 y Rails 3.0.3.

+0

En una segunda pasada, config.reload_plugins = true me funciona. – drewrobb

+0

require_dependency funcionó para mí. Además, como mi plugin requiere sus propios archivos, tuve que reemplazar los que requieren sentencias con require_dependency ... –

+0

Sospecho que reload_plugins no funcionó porque presumiblemente tengo los archivos configurados incorrectamente y no se cargan por rieles de forma automática, lo que requiere en su lugar una declaración manual de 'requiere'. http://stackoverflow.com/questions/1073076/rails-lib-modules-and –

0

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 
0

Esta solución, para los motores, funciona en Rails 2.3 pero viene con una cavaet, lo hará cargue 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 

continuación, inicie el servidor:

RELOAD_MYENGINE=1 rails server 
Cuestiones relacionadas