Перезагрузка приложения Sinatra при каждом запросе в Windows

Я настроил 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().

8
задан Jakub Arnold 3 February 2010 в 14:19
поделиться

4 ответа

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

Из README:

                                Shotgun

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

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

0
ответ дан 5 December 2019 в 06:23
поделиться

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

21
ответ дан 5 December 2019 в 06:23
поделиться

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

# 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
5
ответ дан 5 December 2019 в 06:23
поделиться

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

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

jruby -S trinidad -r config.ru

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

0
ответ дан 5 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: