Ответы:
«Как мне перезагрузить приложение Sinatra при внесении изменений?»
Во-первых, перезагрузка внутрипроцессного кода в Ruby сложна, а наличие решения, работающего для любого сценария, технически невозможно.
Вот почему мы рекомендуем делать перезагрузку вне процесса.
Для начала вам нужно установить rerun, если вы еще этого не сделали:
$ gem install rerun
Теперь, если вы запустите приложение Sinatra следующим образом:
$ ruby app.rb
Все, что вам нужно сделать для перезагрузки, это сделать следующее:
$ rerun 'ruby app.rb'
Если вы, например, используете стойку, вместо этого сделайте следующее:
$ rerun 'Rackup'
Вы уловили идею.
Если вам все еще нужна перезагрузка в процессе, проверьте
Sinatra::Reloader
.
rerun
. Вы не ограничены с параметрами по умолчанию , то есть rerun 'rackup'
. Можно запустить любой сервер на любом порту. Вот пример того, как запустить Puma на порту 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
gem установить sinatra-reloader
require 'sinatra'
require 'sinatra/reloader'
Примечание : он перезагружает только обработчики sinatra (и, возможно, некоторые команды конфигурации сервера sinatra), но не пользовательские файлы, которые необходимо перезагружать вручную.
UPD через 9 лет: похоже, уже можно перезагружать другие файлы с помощью also_reload
, dont_reload
и after_reload
- https://github.com/sinatra/sinatra/pull/1150
require "./my-file"
безуспешно
require
не перезагружает файл, если он уже требовался. load
Вместо этого ты .
server.rb
, чтобы он перезагрузил мой внешний файл. Он не проверяет только мой внешний файл, поэтому мне приходится повторно сохранять его sever.rb
каждый раз, когда я вношу изменения в свой внешний файл. В этом отношении дробовик работает лучше, но он также перезагружает сеансы базы данных.
configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
Когда вы запускаете приложение в автономном режиме Passenger , просто создайте tmp/always_restart
файл:
$ touch tmp/always_restart.txt
См. Дополнительную информацию в документации для пассажиров .
Мне нравится Дробовик. Если вы используете модульное приложение Sinatra и имеете файл config.ru, его легко запустить.
shotgun config.ru
Проверьте драгоценный камень здесь . Это довольно просто и не требует настройки.
В Windows я использую для этого свой гем перезапуска :
restart ruby my_app.rb
или со стойкой:
restart rackup
См. Здесь для получения дополнительной информации, надеюсь, вы найдете это полезным.
Вы можете использовать стойку для охраны. Позаимствовано из статьи на dblock.org :
Добавьте это в свой Gemfile:
group :development do
gem "guard"
gem "guard-bundler"
gem "guard-rack"
end
Затем создайте Guardfile
в корне вашего проекта такой контент:
guard 'bundler' do
watch('Gemfile')
end
guard 'rack' do
watch('Gemfile.lock')
watch(%r{^(config|app|api)/.*})
end
Наконец, запустите Guard, например:, bundle exec guard
и rackup
будет перезагружаться каждый раз.