Перезагрузка приложения Sinatra по каждому запросу в Windows - PullRequest
8 голосов
/ 17 декабря 2009

Я настроил 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 start -R config.ru, но он только перезагружает только что добавленные маршруты. Когда я изменяю уже существующий маршрут, он все еще выполняет старый код.

Когда я добавляю новый маршрут, он корректно перезагружает его, поэтому он доступен, но больше ничего не перезагружается.

Например, если я изменил маршруты на

get '/' do
  'bar'
end

get '/foo' do
  'baz'
end

Чем / все равно будет обслуживать foo, даже если оно изменилось, но /foo будет правильно перезагружаться и обслуживать baz.

Это нормальное поведение или я что-то упустил? Я ожидаю, что весь исходный файл будет перезагружен. Единственный способ обойти это сейчас - перезапустить весь веб-сервер при изменении файловой системы.

Я работаю на Windows Vista x64, поэтому не могу использовать дробовик из-за fork().

Ответы [ 4 ]

21 голосов
/ 26 марта 2010

Вы можете попробовать sinatra-reloader , который, как известно, хорошо работает в Windows (кроме того, он быстрее, чем дробовик).

5 голосов
/ 07 апреля 2010

Это работает:

# 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 голосов
/ 10 августа 2010

Вы также можете попробовать использовать Тринидад контейнер JRuby Rack на основе Tomcat. По моему опыту, перезагрузка по умолчанию не требует изменения исходных файлов. Чертовски быстро тоже. Очевидно, что это бесполезно, если вы используете нативные библиотеки, но если вы развертываете в Windows, вы, вероятно, привыкли использовать чисто рубиновый подход.

Его синтаксис такой же простой, как и тонкий подход:

jruby -S trinidad -r config.ru

Нет специфичного для Java бритья яков (то есть создание web.xml или WAR-up вашего приложения Ruby), и гем прост в установке.

0 голосов
/ 17 декабря 2009

Не работает ли Дробовик в Windows?

от README:

                                Shotgun

Это автоматическая перезагрузка версии команды rackup, которая поставляется с Стеллаж. Может использоваться как альтернатива сложной логике перезагрузки через веб-фреймворки или в средах, которые не поддерживают перезагрузку приложений.

Команда shotgun запускает один из поддерживаемых серверов Rack (например, mongrel, thin, webrick) и слушает запросы, но не загружает какую-либо часть фактического приложение. Каждый раз, когда запрос получен, он разветвляется, загружает приложение в дочерний процесс обрабатывает запрос и выходит из дочернего процесса. Результатом является чистая перезагрузка всех исходных файлов и шаблонов на уровне приложения. каждый запрос.

...