¿Cómo hacer que Sinatra recargue automáticamente el archivo después de cada cambio?

118

estoy usando

# my_app.rb
load 'index.rb'

y comienza el servidor así

ruby my_app.rb

pero nunca recarga los cambios que hice en la página de índice.
¿Me perdí algo aquí?

ez.
fuente

Respuestas:

203

Consulte las preguntas frecuentes de Sinatra ,

"¿Cómo hago para que mi aplicación Sinatra se vuelva a cargar con los cambios?"

En primer lugar, la recarga de código en proceso en Ruby es difícil y tener una solución que funcione para cada escenario es técnicamente imposible.

Es por eso que le recomendamos que realice una recarga fuera del proceso.

Primero debe instalar rerun si aún no lo ha hecho:

 $ gem install rerun

Ahora, si inicia su aplicación Sinatra así:

$ ruby app.rb

Todo lo que tienes que hacer para recargar es hacer esto:

$ rerun 'ruby app.rb'

Si, por ejemplo, está utilizando rackup, haga lo siguiente:

$ rerun 'rackup'

Entiendes la idea.

Si aún desea recargar en proceso, consulte Sinatra::Reloader.

dbr
fuente
La escopeta requiere un config.ru mínimo. Si aún no tiene uno, créelo y ponga "require './my_app'" (donde my_app.rb es su aplicación ruby) en él y estará listo.
Jeffrey Martinez
Pequeña adición a for rerun. No está limitado con las opciones predeterminadas, es decir rerun 'rackup'. Es posible ejecutar cualquier servidor en cualquier puerto. Aquí hay un ejemplo de cómo ejecutar Puma en el puerto número 5678rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov
43

gema instalar sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Nota : solo recargará los controladores de sinatra (y, tal vez, algunos comandos de configuración del servidor de sinatra), pero no los archivos personalizados, que debe recargar manualmente.

UPD después de 9 años: parece que ya es posible recargar otros archivos usando also_reload, dont_reloady after_reload- https://github.com/sinatra/sinatra/pull/1150

Nakilon
fuente
Hola @Nakilon, ¿cómo haría para volver a cargar esos archivos manualmente? Lo estoy haciendo require "./my-file"sin éxito
kristianlm
@kristianlm, requireno recarga el archivo, si ya era necesario. Tu en loadcambio.
Nakilon
tienes razón. Sin server.rbembargo, tengo que volver a guardar mi para que vuelva a cargar mi archivo externo. No comprueba mi archivo externo solo, por lo que tengo que volver a guardarlo sever.rbcada vez que hago un cambio en mi archivo externo. shotgun parece funcionar mejor en este sentido, pero también parece volver a cargar las sesiones de la base de datos.
kristianlm
9
Utilice el método also_reload para especificar qué archivos recargar: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

Puedes usar la rerungema.

gem install rerun
rerun 'ruby app.rb' 

O si está usando rackup

rerun 'rackup'
zeronona
fuente
8

gema instalar sinatra-reloader

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

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

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

Es posible que desee establecer la variable de entorno en desarrollo y cargar condicionalmente la gema.

rafidude
fuente
6

Cuando ejecute la aplicación con Passenger Standalone , simplemente cree un tmp/always_restartarchivo:

$ touch tmp/always_restart.txt

Consulte la documentación del pasajero para obtener más información.

karmi
fuente
5

Me gusta la joya Shotgun. Si está usando una aplicación modular Sinatra y tiene un archivo config.ru, es fácil de ejecutar.

shotgun config.ru

Mira la joya aquí . Es bastante sencillo y no se necesita configuración.


fuente
4

En Windows, estoy usando mi gema de reinicio para esto:

restart ruby my_app.rb

o, con rackup:

restart rackup

Consulte aquí para obtener más información, espero que lo encuentre útil.

Vais Salikhov
fuente
la documentación indica que no funciona en Windows, lo intenté y carga sinatra pero no se recarga en chenges
peter
1

Podrías usar guard-rack. Extraído de un artículo en dblock.org :

Agregue esto a su Gemfile:

group :development do
  gem "guard"
  gem "guard-bundler"
  gem "guard-rack"
end

Luego, crea un Guardfileen la raíz de tu proyecto con este contenido:

guard 'bundler' do
  watch('Gemfile')
end

guard 'rack' do
  watch('Gemfile.lock')
  watch(%r{^(config|app|api)/.*})
end

Por último, ejecute Guard, así: bundle exec guardy rackupse recargará cada vez.

Jeffbyrnes
fuente
0

Si solo cambia sus plantillas, sinatra siempre las volverá a generar si configura su entorno para el desarrollo:

ruby app.rb -e development
Tres
fuente