2009-12-17 2 views
8

Ich habe Rack::Reload aufgebaut gemäß dieser threadNachladen Sinatra-Anwendung auf jede Anfrage auf 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 

mit dünnen Lauf über thin start -R config.ru, aber es lädt nur neu hinzugefügte Routen. Wenn ich die bereits bestehende Route ändere, wird immer noch der alte Code ausgeführt.

Wenn ich eine neue Route hinzufüge, wird sie korrekt neu geladen, ist also zugänglich, lädt aber nichts anderes neu.

Zum Beispiel, wenn ich geändert Routen

get '/' do 
    'bar' 
end 

get '/foo' do 
    'baz' 
end 

als / noch foo dienen würde, auch wenn sie sich geändert hat, aber /foo würde richtig laden und baz dienen.

Ist das normales Verhalten, oder fehlt mir etwas? Ich würde erwarten, dass die ganze Quelldatei neu geladen wird. Der einzige Weg, den ich mir gerade vorstellen kann, ist den Neustart des gesamten Webservers, wenn sich das Dateisystem ändert.

Ich bin auf Windows Vista x64 laufen, so kann ich Schrotflinte wegen fork() nicht verwenden.

Antwort

0

Funktioniert Shotgun nicht unter Windows?

Aus der Readme:

       Shotgun 

Dies ist eine automatische Nachladung Version des rackup Befehl, der mit -Rack ausgeliefert wird. Es kann als Alternative zu der von Web-Frameworks bereitgestellten komplexen Nachladelogik oder in Umgebungen verwendet werden, die das Nachladen von Anwendungen nicht unterstützen.

Die Flinte Befehl startet eines der Racks unterstützten Server (zum Beispiel, nicht reinrassig, dünn, webrick) und wartet auf Anfragen aber nicht geladen jeden Teil der tatsächlichen Anwendung. Jedes Mal, wenn eine Anforderung empfangen wird, wird die Anwendung unter in den untergeordneten Prozess geladen, die Anforderung wird verarbeitet und der untergeordnete Prozess wird beendet. Das Ergebnis ist sauberes, anwendungsweites Neuladen aller Quelldateien und Vorlagen unter jeder Anfrage.

+0

Sorry, habe deine Notiz über Shotgun nicht gesehen –

21

Sie könnten versuchen sinatra-reloader, die bekannt ist, um unter Windows gut zu funktionieren (auch, es ist schneller als Schrotflinte).

+0

Für was war die Abstimmung? –

+1

Wir hatten dieses Problem selbst, da zwei von meinem Team Windows verwenden, und zwei auf Macs. Das ist die Lösung, mit der wir gegangen sind, scheint bisher gut zu funktionieren. –

+2

nicht nur schneller, aber ich finde sinatra-reloader einfacher zu bedienen :-) – Radek

5

Dies funktioniert:

# 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 

Es kommt von wo aus man die Aussage erfordern haben. Aber ich finde die folgende Lösung eleganter und robust:

# 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

Perfekt! Führen Sie für eine modulare App MyAppClassName (config.ru) aus, und fügen Sie Sinatra :: Application.reset hinzu! in der App-Klasse (app.rb). – aaandre

0

Sie auch Trinidad basierend auf Tomcat einen JRuby Rack-Container mit ausprobieren können. Nach meiner Erfahrung ändert sich das Neuladen standardmäßig, ohne dass die Quelldateien geändert werden müssen. Verdammt schnell auch. Natürlich ist es nicht gut, wenn Sie native Bibliotheken verwenden, aber wenn Sie Windows einsetzen, sind Sie wahrscheinlich daran gewöhnt, einen reinen Rubin-Ansatz zu verfolgen.

Seine Syntax ist genauso einfach wie der dünne Ansatz:

jruby -S trinidad -r config.ru 

Es gibt keine Java spezifische Yak Rasieren (das heißt die Schaffung web.xml oder Waring bis Ruby app) und der Edelstein ist einfach zu installieren.