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

Jak*_*old 8 ruby rack sinatra reloading

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
Run Code Online (Sandbox Code Playgroud)

使用thin via运行thin start -R config.ru,但它只重新加载新添加的路由.当我更改现有路由时,它仍然运行旧代码.

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

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

get '/' do
  'bar'
end

get '/foo' do
  'baz'
end
Run Code Online (Sandbox Code Playgroud)

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

这是正常的行为,还是我错过了什么?我希望重新加载整个源文件.我现在想到的唯一方法是在文件系统更改时重新启动整个Web服务器.

我在Windows Vista 64位上运行,所以我不能用猎枪因为fork().

Kon*_*ase 21

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

  • 不仅更快,但我发现sinatra-reloader更容易使用:-) (2认同)

Jan*_*kel 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
Run Code Online (Sandbox Code Playgroud)

从您拥有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
Run Code Online (Sandbox Code Playgroud)


小智 0

Shotgun无法在 Windows 上运行吗?

来自自述文件:

                                Shotgun
Run Code Online (Sandbox Code Playgroud)

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

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