Как заставить Sinatra автоматически перезагружать файл после каждого изменения?

118

Я использую

# my_app.rb
load 'index.rb'

и запустите сервер вот так

ruby my_app.rb

но он никогда не перезагружает никаких изменений, которые я сделал на странице индекса.
Я что-то здесь пропустил?

эз.
источник

Ответы:

203

См. FAQ по Sinatra ,

«Как мне перезагрузить приложение Sinatra при внесении изменений?»

Во-первых, перезагрузка внутрипроцессного кода в Ruby сложна, а наличие решения, работающего для любого сценария, технически невозможно.

Вот почему мы рекомендуем делать перезагрузку вне процесса.

Для начала вам нужно установить rerun, если вы еще этого не сделали:

 $ gem install rerun

Теперь, если вы запустите приложение Sinatra следующим образом:

$ ruby app.rb

Все, что вам нужно сделать для перезагрузки, это сделать следующее:

$ rerun 'ruby app.rb'

Если вы, например, используете стойку, вместо этого сделайте следующее:

$ rerun 'Rackup'

Вы уловили идею.

Если вам все еще нужна перезагрузка в процессе, проверьте Sinatra::Reloader.

DBR
источник
Для дробовика требуется минимальный config.ru. Если у вас его еще нет, создайте его и вставьте в него «require './my_app'» (где my_app.rb - ваше приложение на Ruby), и все будет готово.
Джеффри Мартинес
Небольшое дополнение к for rerun. Вы не ограничены с параметрами по умолчанию , то есть rerun 'rackup'. Можно запустить любой сервер на любом порту. Вот пример того, как запустить Puma на порту 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov
43

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

Nakilon
источник
Привет, @Nakilon, как мне повторно загрузить такие файлы вручную? Я делаю require "./my-file"безуспешно
Кристианлм
@kristianlm, requireне перезагружает файл, если он уже требовался. loadВместо этого ты .
Накилон 01
Ты прав. Однако мне нужно повторно сохранить мой server.rb, чтобы он перезагрузил мой внешний файл. Он не проверяет только мой внешний файл, поэтому мне приходится повторно сохранять его sever.rbкаждый раз, когда я вношу изменения в свой внешний файл. В этом отношении дробовик работает лучше, но он также перезагружает сеансы базы данных.
kristianlm
9
Используйте метод also_reload, чтобы указать, какие файлы нужно перезагрузить:configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
Opptatt Jobber
12

Вы можете использовать rerunдрагоценный камень.

gem install rerun
rerun 'ruby app.rb' 

ИЛИ если вы используете Rackup

rerun 'rackup'
zeronone
источник
8

gem установить sinatra-reloader

require 'sinatra/base'
require "sinatra/reloader"

class MyApp < Sinatra::Base
  register Sinatra::Reloader

  get '/' do
    "Hello Testing1!"
  end
end

Вы можете установить переменную среды для разработки и условно загрузить гем.

rafidude
источник
5

Мне нравится Дробовик. Если вы используете модульное приложение Sinatra и имеете файл config.ru, его легко запустить.

shotgun config.ru

Проверьте драгоценный камень здесь . Это довольно просто и не требует настройки.


источник
4

В Windows я использую для этого свой гем перезапуска :

restart ruby my_app.rb

или со стойкой:

restart rackup

См. Здесь для получения дополнительной информации, надеюсь, вы найдете это полезным.

Вайс Салихов
источник
в документации указано, что он не работает в окнах, я пробовал, и он загружает синатру, но не перезагружается на ченжах
Питер
1

Вы можете использовать стойку для охраны. Позаимствовано из статьи на 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будет перезагружаться каждый раз.

jeffbyrnes
источник
0

Если вы измените только свои шаблоны, sinatra всегда будет их повторно отображать, если вы настроите среду для разработки:

ruby app.rb -e development
три
источник