Come ottenere Sinatra per ricaricare automaticamente il file dopo ogni modifica?


118

sto usando

# my_app.rb
load 'index.rb'

e avvia il server in questo modo

ruby my_app.rb

ma non ricarica mai le modifiche apportate nella pagina dell'indice.
Mi sono perso qualcosa qui?

Risposte:


203

Vedi le FAQ di Sinatra ,

"Come faccio a ricaricare la mia app Sinatra in caso di modifiche?"

Prima di tutto, ricaricare il codice in-process in Ruby è difficile e avere una soluzione che funzioni per ogni scenario è tecnicamente impossibile.

Questo è il motivo per cui ti consigliamo di eseguire il ricaricamento fuori processo.

Per prima cosa è necessario installare rieseguire se non lo hai già fatto:

 $ gem install rerun

Ora se avvii la tua app Sinatra in questo modo:

$ ruby app.rb

Tutto quello che devi fare per ricaricare è invece fare questo:

$ rerun 'ruby app.rb'

Se ad esempio stai usando rackup, procedi come segue:

$ rerun 'rackup'

Hai l'idea.

Se vuoi ancora ricaricare in-process, controlla Sinatra::Reloader.


il fucile richiede un config.ru minimo. Se non ne hai già uno, crealo e inserisci "require './my_app'" (dove my_app.rb è la tua app Ruby) e sarai pronto.
Jeffrey Martinez

Piccola aggiunta a per rerun. Non sei limitato con le opzioni predefinite, ad es rerun 'rackup'. È possibile eseguire qualsiasi server su qualsiasi porta. Ecco un esempio di come eseguire Puma sulla porta numero 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem installa sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Nota : ricaricherà solo i gestori di sinatra (e, forse, alcuni comandi di configurazione del server sinatra), ma non i file personalizzati, che devi ricaricare manualmente.

UPD dopo 9 anni: sembra che sia già possibile ricaricare altri file usando also_reload, dont_reloade after_reload- https://github.com/sinatra/sinatra/pull/1150


Ehi @Nakilon, come posso ricaricare manualmente questi file? Sto facendo require "./my-file"senza successo
kristianlm

@kristianlm, requirenon ricarica il file, se era già richiesto. Tu loadinvece.
Nakilon

hai ragione. Devo salvare di nuovo il mio server.rb, però, per farlo ricaricare il mio file esterno. Non controlla solo il mio file esterno, quindi devo salvarlo nuovamente sever.rbogni volta che apporto una modifica al mio file esterno. shotgun sembra funzionare meglio in questo senso, ma sembra anche ricaricare le sessioni del database.
kristianlm

9
Usa il metodo also_reload per specificare quali file ricaricare: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

Puoi usare la rerungemma.

gem install rerun
rerun 'ruby app.rb' 

O se stai usando rackup

rerun 'rackup'

8

gem installa sinatra-reloader

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

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

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

Potresti voler impostare la variabile d'ambiente su sviluppo e caricare condizionalmente la gemma.



5

Mi piace la gemma del fucile a pompa. Se stai utilizzando un'app Sinatra modulare e hai un file config.ru, è facile da eseguire.

shotgun config.ru

Controlla la gemma qui . È abbastanza semplice e non è necessaria alcuna configurazione.


4

Su Windows, sto usando la mia gemma di riavvio per questo:

restart ruby my_app.rb

oppure, con rackup:

restart rackup

Vedi qui per maggiori informazioni, spero che lo trovi utile.


la documentazione afferma che non funziona su Windows, ho provato e carica sinatra ma non si ricarica su chenges
peter

1

Potresti usare guard-rack. Estratto da un articolo su dblock.org :

Aggiungi questo al tuo Gemfile:

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

Quindi, crea un Guardfilealla radice del tuo progetto con questo contenuto:

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

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

Infine, esegui Guard, in questo modo: bundle exec guarde rackupricaricherai ogni volta.


0

Se modifichi solo i tuoi modelli, sinatra li rivedrà sempre se imposti il ​​tuo ambiente su sviluppo:

ruby app.rb -e development
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.