Ruby 在Windows上的每个请求上重新加载Sinatra应用程序

Ruby 在Windows上的每个请求上重新加载Sinatra应用程序,ruby,sinatra,rack,reloading,Ruby,Sinatra,Rack,Reloading,我已经根据此设置了Rack::Reload 而/将仍然提供foo,即使它已更改,但/foo将正确地重新加载并提供baz 这是正常行为,还是我遗漏了什么?我希望重新加载整个源文件。我现在能想到的唯一解决办法是在文件系统发生变化时重新启动整个Web服务器 我在Windows Vista x64上运行,因此无法使用“鸟枪”,因为fork()在Windows上不起作用 自述文件: Shotgun 这是随附的rackup命令的自动重新加载版

我已经根据此设置了
Rack::Reload

/
将仍然提供
foo
,即使它已更改,但
/foo
将正确地重新加载并提供
baz

这是正常行为,还是我遗漏了什么?我希望重新加载整个源文件。我现在能想到的唯一解决办法是在文件系统发生变化时重新启动整个Web服务器

我在Windows Vista x64上运行,因此无法使用“鸟枪”,因为
fork()

在Windows上不起作用

自述文件:

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

shotgun命令启动机架支持的服务器之一(例如,mongrel、thin、, webrick)并侦听请求,但不加载实际数据的任何部分 应用每次收到请求时,它都会分叉并加载应用程序 子进程,处理请求,然后退出子进程。这个 结果是在应用程序范围内重新加载上的所有源文件和模板 每个请求。

您可以尝试,这在Windows上运行良好(而且,它比霰弹枪更快)。

此功能:

# 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
您还可以尝试使用基于Tomcat的JRuby Rack容器。根据我的经验,它在默认情况下确实会更改重新加载,而无需修改源文件。太快了。如果您使用本机库,显然没有什么好处,但是如果您在Windows上部署,您可能已经习惯于采用纯ruby方法

其语法与精简方法一样简单:

jruby -S trinidad -r config.ru

没有特定于Java的yak剃须(即创建web.xml或启动Ruby应用程序),gem安装简单

抱歉,没有看到您关于散弹枪的说明我们自己也有这个问题,因为我的团队有两个使用Windows,两个在Mac上。这是我们使用的解决方案,到目前为止似乎运行良好。不仅速度更快,而且我发现sinatra reloader更易于使用:-)完美!对于模块化应用程序,运行MyAppClassName(config.ru)并包含Sinatra::Application.reset!在app类(app.rb)中。
# 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
jruby -S trinidad -r config.ru