124 Stimmen

Wie kann ich Sinatra dazu bringen, die Datei nach jeder Änderung automatisch neu zu laden?

Ich verwende

# my_app.rb
load 'index.rb'

und starten Sie den Sever wie folgt

ruby my_app.rb

aber es lädt nie die Änderungen, die ich auf der Indexseite vorgenommen habe.
Habe ich hier etwas verpasst?

214voto

dbr Punkte 158949

Siehe die Sinatra FAQ,

"Wie mache ich mein Sinatra-App neu laden bei Änderungen?"

Zunächst einmal ist das in-process Code-Neuladen in Ruby schwierig, und eine Lösung, die für jede Situation funktioniert, ist technisch unmöglich.

Deshalb empfehlen wir dir, das Out-of-Process-Neuladen zu machen.

Zuerst musst du rerun installieren, falls du es noch nicht getan hast:

 $ gem install rerun

Jetzt, wenn du dein Sinatra-App so startest:

$ ruby app.rb

Alles, was du für das Neuladen tun musst, ist stattdessen dies zu tun:

$ rerun 'ruby app.rb'

Wenn du beispielsweise rackup verwendest, mache stattdessen folgendes:

$ rerun 'rackup'

Du verstehst schon.

Wenn du immer noch das in-process Neuladen möchtest, schau dir Sinatra::Reloader an.

0 Stimmen

Das Shotgun benötigt eine minimale config.ru. Wenn Sie noch keine haben, erstellen Sie eine und setzen Sie "require './my_app'" (wobei my_app.rb Ihre Ruby-App ist) hinein und Sie sind fertig.

0 Stimmen

Kleines Addition für rerun. Sie sind nicht auf die Standardoptionen beschränkt, d. h. rerun 'rackup'. Es ist möglich, jeden Server auf jedem Port auszuführen. Hier ist ein Beispiel, wie man Puma auf dem Port 5678 ausführt — rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'

45voto

Nakilon Punkte 33536

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Hinweis: Es lädt nur die sinatra-Handler neu (und vielleicht einige sinatra-Serverkonfigurationsbefehle), nicht jedoch benutzerdefinierte Dateien, die manuell neu geladen werden müssen.

UPDATE nach 9 Jahren: Es scheint bereits möglich zu sein, auch andere Dateien mit also_reload, dont_reload und after_reload neu zu laden -- https://github.com/sinatra/sinatra/pull/1150

0 Stimmen

Hey @Nakilon, wie kann ich solche Dateien manuell neu laden? Ich mache require "./my-file" ohne Erfolg.

0 Stimmen

@kristianlm, require lädt die Datei nicht erneut, wenn sie bereits erforderlich war. Verwenden Sie stattdessen load.

0 Stimmen

Du hast recht. Ich muss jedoch meine server.rb neu speichern, um die externe Datei neu zu laden. Es überprüft nicht nur meine externe Datei, also muss ich jedes Mal meine server.rb neu speichern, wenn ich eine Änderung an meiner externen Datei vornehme. Shotgun scheint in dieser Hinsicht besser zu funktionieren, aber es lädt auch die Datenbanksitzungen neu.

14voto

zeronone Punkte 2742

Sie können das rerun Gem verwenden.

gem install rerun
rerun 'ruby app.rb' 

ODER, wenn Sie rackup verwenden

rerun 'rackup'

11voto

rafidude Punkte 4286

Gem install sinatra-reloader

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

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

  get '/' do
    "Hello Testing1!"
  end

Sie möchten möglicherweise die Umgebungsvariable auf Entwicklung setzen und das Paket bedingt laden.

6voto

karmi Punkte 13269

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

$ touch tmp/always_restart.txt

Weitere Informationen finden Sie in der Passenger Dokumentation.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X