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?

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.


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


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'

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.



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.


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.