2009-12-17 9 views
8

He configurado Rack::Reload de acuerdo con esta threadRecarga Sinatra aplicación en cada petición en Windows

# config.ru 
require 'rubygems' 
require 'sinatra' 

set :environment, :development 

require 'app' 
run Sinatra::Application 

# app.rb 
class Sinatra::Reloader < Rack::Reloader 
    def safe_load(file, mtime, stderr = $stderr) 
    if file == Sinatra::Application.app_file 
     ::Sinatra::Application.reset! 
     stderr.puts "#{self.class}: reseting routes" 
    end 
    super 
    end 
end 

configure(:development) { use Sinatra::Reloader } 

get '/' do 
    'foo' 
end 

Correr con fina mediante la thin start -R config.ru, pero sólo se vuelve a cargar rutas recién añadidos. Cuando cambio la ruta ya existente, todavía ejecuta el código anterior.

Cuando agrego una nueva ruta, la vuelve a cargar correctamente, por lo que es accesible, pero no vuelve a cargar nada más.

Por ejemplo, si cambio de rutas a

get '/' do 
    'bar' 
end 

get '/foo' do 
    'baz' 
end 

Que / que todavía sirven foo, a pesar de que ha cambiado, pero /foo gustaría recargar y servir baz correctamente.

¿Es este comportamiento normal o me falta algo? Espero que todo el archivo fuente se vuelva a cargar. La única forma de pensar en este momento es reiniciar todo el servidor web cuando cambia el sistema de archivos.

estoy corriendo en Windows Vista x64, por lo que no se puede utilizar escopeta debido fork().

Respuesta

0

¿No funciona el Shotgun en Windows?

Desde el README:

       Shotgun 

Ésta es una versión de carga automática del comando rackup que se envía con Rack. Se puede utilizar como una alternativa a la compleja lógica de recarga proporcionada por marcos web o en entornos que no admiten la recarga de aplicaciones.

El comando escopeta comienza uno de los servidores soportados Rack (por ejemplo, mestizo, delgado, WEBrick) y escucha las peticiones, pero no se carga cualquier parte de la aplicación real . Cada vez que se recibe una solicitud, bifurca, carga la aplicación en el proceso hijo, procesa la solicitud y sale del proceso hijo. El resultado de es la recarga completa y limpia de toda la aplicación de todos los archivos fuente y plantillas al cada solicitud.

+0

Lo siento, no vi su nota sobre Shotgun –

21

Puede probar sinatra-reloader, que se sabe que funciona bien en Windows (también es más rápido que la escopeta).

+0

¿Cuál fue el voto negativo? –

+1

Tuvimos este problema nosotros mismos, ya que dos de mi equipo usan Windows, y dos están en Mac. Esta es la solución con la que fuimos, parece estar funcionando bien hasta ahora. –

+2

no solo más rápido, sino que también me resulta fácil de usar sinatra-reloader :-) – Radek

5

Esto funciona:

# config.ru 
require 'rubygems' 
require 'app' 

set :environment, :development 
run Sinatra::Application 

# app.rb 
require 'sinatra' 

class Sinatra::Reloader < Rack::Reloader 
    def safe_load(file, mtime, stderr = $stderr) 
    if file == File.expand_path(Sinatra::Application.app_file) 
     ::Sinatra::Application.reset! 
     stderr.puts "#{self.class}: reseting routes" 
    end 
    super 
    end 
end 

configure(:development) { use Sinatra::Reloader } 

get '/' do 
    'foo' 
end 

Importa desde donde se tiene la declaración requieren. Pero encuentro la siguiente solución más elegante y robusto:

# config.ru 
require 'rubygems' 
require 'sinatra' 
require 'rack/reloader' 
require 'app' 

set :environment, :development 

use Rack::Reloader, 0 if development? 
run Sinatra::Application 

# app.rb 
Sinatra::Application.reset! 
get '/' do 
    'foo' 
end 
+0

¡Perfecto! Para una aplicación modular, ejecute MyAppClassName (config.ru) e incluya Sinatra :: Application.reset! en la clase de la aplicación (app.rb). – aaandre

0

También puede intentar usar un recipiente Trinidad rack JRuby basada en Tomcat. En mi experiencia, cambia la recarga por defecto sin tener que modificar tus archivos fuente. Sangriento rápido también. Obviamente no es bueno si está utilizando bibliotecas nativas, pero si está implementando en Windows probablemente esté acostumbrado a adoptar un enfoque de rubí puro.

Su sintaxis es tan simple como el enfoque fino:

jruby -S trinidad -r config.ru 

No hay Java afeitar de yak específica (es decir, la creación de web.xml o el tener cuidado con su aplicación Rubí) y la gema es fácil de instalar.

Cuestiones relacionadas