Antworten:
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
.
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'
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_reload
und after_reload
- https://github.com/sinatra/sinatra/pull/1150
require "./my-file"
ohne Erfolg
require
die Datei nicht neu, wenn sie bereits benötigt wurde. Sie load
stattdessen.
server.rb
, damit sie meine externe Datei neu lädt. Meine externe Datei wird nicht alleine überprüft, daher muss ich sie sever.rb
jedes 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.
configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
Wenn Sie die Anwendung mit Passenger Standalone ausführen , erstellen Sie einfach eine tmp/always_restart
Datei:
$ touch tmp/always_restart.txt
Siehe Passagier Dokumentation für weitere Informationen.
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.
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.
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 Guardfile
an 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 guard
und rackup
wird jedes Mal neu geladen.