2009-12-17 7 views
8

ho creato Rack::Reload secondo questo threadRicarica Sinatra applicazione su ogni richiesta su 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 

Correndo con sottile tramite thin start -R config.ru, ma ricarica solo percorsi appena aggiunti. Quando cambio rotta già esistente, esegue ancora il vecchio codice.

Quando aggiungo nuova rotta, ricaricata correttamente, in modo che sia accessibile, ma non ricarica niente altro.

Per esempio, se ho cambiato rotte per

get '/' do 
    'bar' 
end 

get '/foo' do 
    'baz' 
end 

Than / sarebbe ancora servire foo, anche se è cambiato, ma /foo sarebbe correttamente ricaricare e servire baz.

È normale, o mi sto perdendo qualcosa? Mi aspetto che tutto il file sorgente venga ricaricato. L'unico modo in cui posso pensare al momento è il riavvio dell'intero webserver quando il filesystem cambia.

Sono in esecuzione su Windows Vista x64, quindi non posso usare fucile a causa di fork().

risposta

0

Does Shotgun non funziona su Windows?

Dal README:

       Shotgun 

Questa è una versione di caricamento automatico del comando rackup che è fornito con Rack. Può essere utilizzato come alternativa alla complessa logica di ricarica fornita da da framework Web o ambienti che non supportano il ricaricamento dell'applicazione.

Il comando fucile inizia uno dei server supportati di Rack (ad esempio, bastardo, sottile, WEBrick) e ascolta le richieste, ma non carica alcuna parte del effettiva applicazione. Ogni volta che viene ricevuta una richiesta, questa si blocca, carica l'applicazione nel processo figlio, elabora la richiesta ed esce dal processo figlio. Il risultato dello è il ricaricamento pulito a livello di applicazione di tutti i file e modelli di origine su ogni richiesta.

+0

Spiacente, non ho visto la tua nota su Shotgun –

21

Si potrebbe provare sinatra-reloader, che è noto per lavorare bene su Windows (anche, è più veloce di fucile da caccia).

+0

Qual è stato il down-vote per? –

+1

Abbiamo avuto questo problema da soli, dal momento che due membri del mio team usano Windows e due sono su Mac. Questa è la soluzione che abbiamo seguito, sembra che stia funzionando bene finora. –

+2

non solo più veloce, ma trovo che sinatra-reloader è più facile da usare :-) – Radek

5

Questo funziona:

# 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 da dove si ha la dichiarazione richiedono. Ma trovo la seguente soluzione più elegante e robusta:

# 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

Perfetto! Per un'app modulare, esegui MyAppClassName (config.ru) e includi Sinatra :: Application.reset! nella classe dell'app (app.rb). – aaandre

0

Si può anche provare a utilizzare Trinidad un contenitore rack JRuby sulla base di Tomcat. Nella mia esperienza cambia il ricaricamento di default senza dover modificare i file sorgente. Anche veloce. Ovviamente non va bene se si stanno usando le librerie native, ma se si sta distribuendo su Windows si è probabilmente abituati ad adottare un approccio puramente rubino.

La sua sintassi è altrettanto semplice come l'approccio sottile:

jruby -S trinidad -r config.ru 

Non c'è Java specifica yak rasatura (vale a dire la creazione o web.xml Waring il vostro Rubino app) e la gemma è semplice da installare.

Problemi correlati