Я настроил 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()
.
Не работает ли Shotgun в Windows?
Из README:
Shotgun
Это версия команды с автоматической перезагрузкой, которая поставляется с Стойка. Его можно использовать как альтернативу сложной логике перезагрузки. веб-фреймворками или в средах, которые не поддерживают перезагрузку приложений.
Команда shotgun запускает один из поддерживаемых серверов Rack (например, mongrel, thin, webrick) и прослушивает запросы, но не загружает никакую часть фактического заявление. Каждый раз, когда запрос получен, он разветвляется, загружает приложение в дочерний процесс, обрабатывает запрос и выходит из дочернего процесса. В результатом является чистая перезагрузка всех исходных файлов и шаблонов в масштабе всего приложения на каждый запрос.
Вы можете попробовать sinatra-reloader , который, как известно, хорошо работает в Windows (а также быстрее, чем дробовик).
Это работает:
# 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
Вы также можете попробовать использовать Trinidad контейнер JRuby Rack на основе Tomcat. По моему опыту, он меняет перезагрузку по умолчанию без изменения исходных файлов. Тоже чертовски быстро. Очевидно, что это бесполезно, если вы используете собственные библиотеки, но если вы выполняете развертывание в Windows, вы, вероятно, привыкли использовать чисто рубиновый подход.
Его синтаксис так же прост, как и тонкий подход:
jruby -S trinidad -r config.ru
Не существует специфичного для Java бритья (т.е. создания web.xml или WARing up вашего Ruby-приложения), и гем прост в установке.