2009-12-17 34 views
8

每一个请求重新加载西纳特拉应用,我根据这个thread在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 

通过thin start -R config.ru薄运行设置Rack::Reload,但它只是重新加载新添加的路由。当我改变已经存在的路线时,它仍然运行旧的代码。

当我添加新路由时,它正确地重新加载它,因此它是可访问的,但它不会重新加载其他任何东西。

例如,如果我改变路线

get '/' do 
    'bar' 
end 

get '/foo' do 
    'baz' 
end 

/仍将担任foo,即使它已经改变了,但/foo会正确地重新加载和服务baz

这是正常行为,还是我错过了什么?我期望整个源文件被重新加载。我现在唯一能想到的就是在文件系统发生变化时重新启动整个网络服务器。

我在Windows Vista x64上运行,所以我不能使用霰弹枪,因为fork()

回答

0

Shotgun不适用于Windows?

自述:

       Shotgun 

这就是会随 机架中rackup命令的自动重载版本。它可以用作Web框架或不支持应用程序重新加载的环境中提供的复杂重新加载逻辑的替代方案。

猎枪命令启动机架的支持的服务器(例如,杂种,薄, 的WEBrick)中的一个,并侦听请求,但没有加载实际应用 的任何部分。每次收到请求时,都会分叉,将子进程中的应用程序加载到 中,处理请求并退出子进程。 结果是干净的,在每个请求的 上的全部应用程序范围内重新加载所有源文件和模板。

+0

对不起,没有看到你关于Shotgun的说明 – 2009-12-17 20:53:41

21

你可以试试sinatra-reloader,这在Windows上可以很好地运行(也比霰弹枪更快)。

+0

什么是反对票? – 2010-07-12 13:12:56

+1

我们自己有这个问题,因为我的两个团队使用Windows,而两个使用Mac。这是我们一起工作的解决方案,目前似乎运作良好。 – 2010-07-12 14:02:58

+2

不仅更快,但我发现sinatra-reloader更易于使用:-) – Radek 2010-10-13 23:59:05

5

这工作:

# 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 

它从那里你有需要声明事项。但我发现了以下解决方案更优雅和强大:

# 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

完美!对于模块化应用程序,运行MyAppClassName(config.ru)并包含Sinatra :: Application.reset!在应用程序类(app.rb)中。 – aaandre 2012-01-06 20:29:16

0

您也可以尝试使用基于Trinidad在Tomcat上的JRuby架容器。根据我的经验,默认情况下会更改重新加载,而无需修改源文件。血腥也快。显然,如果你使用本地库,这并不好,但如果你在Windows上部署,你可能习惯采用纯ruby方法。

它的语法是一样薄的做法一样简单:

jruby -S trinidad -r config.ru 

没有特定于Java的牦牛剃须(即创建web.xml文件或留神你的Ruby应用程序)和创业板是安装简单。