8

我已经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

使用瘦 via 运行thin start -R config.ru,但它只重新加载新添加的路由。当我更改已经存在的路线时,它仍然运行旧代码。

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

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

get '/' do
  'bar'
end

get '/foo' do
  'baz'
end

/仍然发球foo,即使它已经改变,但/foo会正确地重新加载和发球baz

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

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

4

4 回答 4

21

您可以尝试sinatra-reloader,众所周知,它在 Windows 上运行良好(而且它比 shotgun 更快)。

于 2010-03-26T00:05:41.613 回答
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
于 2010-04-07T00:01:40.197 回答
0

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

它的语法和瘦方法一样简单:

jruby -S trinidad -r config.ru

没有 Java 特定的牦牛剃须(即创建 web.xml 或对您的 Ruby 应用程序进行 WARing),并且 gem 易于安装。

于 2010-08-10T09:22:13.567 回答
0

Shotgun不能在 Windows 上运行吗?

从自述文件:

                                Shotgun

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

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

于 2009-12-17T20:52:58.497 回答