Wie kann Sinatra die Datei nach jeder Änderung automatisch neu laden?

118

ich benutze

# my_app.rb
load 'index.rb'

und starten Sie den Server so

ruby my_app.rb

Es werden jedoch keine Änderungen neu geladen, die ich auf der Indexseite vorgenommen habe.
Habe ich hier etwas verpasst?

ez.
quelle

Antworten:

203

Siehe die Sinatra FAQ ,

"Wie kann ich meine Sinatra-App bei Änderungen neu laden?"

Zunächst einmal ist das erneute Laden von Code in Ruby schwierig und es ist technisch unmöglich, eine Lösung zu finden, die für jedes Szenario funktioniert.

Aus diesem Grund empfehlen wir Ihnen, das Laden außerhalb des Prozesses durchzuführen.

Zuerst müssen Sie rerun installieren, falls Sie dies noch nicht getan haben:

 $ gem install rerun

Wenn Sie jetzt Ihre Sinatra-App wie folgt starten:

$ ruby app.rb

Alles, was Sie zum Nachladen tun müssen, ist stattdessen Folgendes:

$ rerun 'ruby app.rb'

Wenn Sie beispielsweise Rackup verwenden, gehen Sie stattdessen wie folgt vor:

$ rerun 'Rackup'

Du hast die Idee.

Wenn Sie weiterhin ein In-Process-Reload durchführen möchten, lesen Sie Sinatra::Reloader.

dbr
quelle
Schrotflinte erfordert eine minimale config.ru. Wenn Sie noch keine haben, erstellen Sie sie und geben Sie "require './my_app'" (wobei my_app.rb Ihre Ruby-App ist) ein, und Sie werden festgelegt.
Jeffrey Martinez
Kleine Ergänzung zu für rerun. Sie sind nicht auf Standardoptionen beschränkt, z rerun 'rackup'. Es ist möglich, jeden Server an jedem Port auszuführen. Hier ist ein Beispiel, wie man Puma auf Portnummer 5678 rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
ausführt
43

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Hinweis : Es werden nur Sinatra-Handler (und möglicherweise einige Konfigurationsbefehle für Sinatra-Server) neu geladen, jedoch keine benutzerdefinierten Dateien, die Sie manuell neu laden müssen.

UPD nach 9 Jahren: scheint , wie es bereits möglich ist , andere Dateien zu laden verwenden also_reload, dont_reloadund after_reload- https://github.com/sinatra/sinatra/pull/1150

Nakilon
quelle
Hey @Nakilon, wie würde ich vorgehen, um solche Dateien manuell neu zu laden? Ich mache require "./my-file"ohne Erfolg
kristianlm
@kristianlm, lädt requiredie Datei nicht neu, wenn sie bereits benötigt wurde. Sie loadstattdessen.
Nakilon
Du hast recht. Ich muss meine jedoch erneut speichern server.rb, damit sie meine externe Datei neu lädt. Meine externe Datei wird nicht alleine überprüft, daher muss ich sie sever.rbjedes Mal neu speichern, wenn ich Änderungen an meiner externen Datei vornehme. Schrotflinte scheint in dieser Hinsicht besser zu funktionieren, aber sie scheint auch die Datenbanksitzungen neu zu laden.
Kristianlm
9
Verwenden Sie die Methode auch_reload, um anzugeben, welche Dateien neu configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
geladen werden sollen
12

Sie können den rerunEdelstein verwenden.

gem install rerun
rerun 'ruby app.rb' 

ODER wenn Sie Rackup verwenden

rerun 'rackup'
Nullon
quelle
8

gem install sinatra-reloader

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

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

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

Möglicherweise möchten Sie die Umgebungsvariable auf Entwicklung setzen und den Edelstein bedingt laden.

rafidude
quelle
6

Wenn Sie die Anwendung mit Passenger Standalone ausführen , erstellen Sie einfach eine tmp/always_restartDatei:

$ touch tmp/always_restart.txt

Siehe Passagier Dokumentation für weitere Informationen.

Karmi
quelle
5

Ich mag das Shotgun-Juwel. Wenn Sie eine modulare Sinatra-App verwenden und eine config.ru-Datei haben, ist diese einfach auszuführen.

shotgun config.ru

Schauen Sie sich das Juwel hier an . Es ist ziemlich einfach und es ist keine Konfiguration erforderlich.


quelle
4

Unter Windows verwende ich mein Neustart-Juwel dafür:

restart ruby my_app.rb

oder mit Rackup:

restart rackup

Sehen Sie hier für weitere Informationen, hoffen , dass Sie es nützlich finden.

Vais Salikhov
quelle
In der Dokumentation , dass es nicht die Arbeit an Windows der Fall ist, habe ich versucht , und es lädt sinatra aber nicht nachladen nicht auf chenges
Peter
1

Sie könnten eine Schutzablage verwenden. Aus einem Artikel auf dblock.org :

Fügen Sie dies Ihrem Gemfile hinzu:

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

Erstellen Sie dann eine Guardfilean der Wurzel Ihres Projekts mit diesem Inhalt:

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

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

Führen Sie zum Schluss Guard wie folgt aus : bundle exec guardund rackupwird jedes Mal neu geladen.

jeffbyrnes
quelle
0

Wenn Sie nur Ihre Vorlagen ändern, werden sie von sinatra immer wieder gerendert, wenn Sie Ihre Umgebung auf Entwicklung einstellen:

ruby app.rb -e development
drei
quelle