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

时间:2009-12-17 12:08:51

标签: ruby sinatra rack reloading

我根据此thread

设置了Rack::Reload
# 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 via thin start -R config.ru运行,但它只重新加载新添加的路由。当我更改现有路线时,它仍会运行旧代码。

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

例如,如果我将路线更改为

get '/' do
  'bar'
end

get '/foo' do
  'baz'
end

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

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

我在Windows Vista x64上运行,因为fork()我无法使用霰弹枪

4 个答案:

答案 0 :(得分:21)

您可以尝试使用sinatra-reloader,这在Windows上运行良好(同样,它比霰弹枪更快)。

答案 1 :(得分: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

从您拥有require语句的位置来看很重要。但我发现以下解决方案更优雅,更健壮:

# 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

答案 2 :(得分:0)

Shotgun无法在Windows上运行吗?

来自自述文件:

                                Shotgun

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

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

答案 3 :(得分:0)

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

它的语法就像瘦方法一样简单:

jruby -S trinidad -r config.ru

没有Java特定的牦牛剃须(即创建web.xml或警告你的Ruby应用程序)并且gem易于安装。