120 votes

Comment faire en sorte que Sinatra recharge automatiquement le fichier après chaque modification ?

J'utilise

# my_app.rb
load 'index.rb'

et lancez la séparation comme ceci

ruby my_app.rb

mais il ne recharge jamais les modifications que j'ai apportées à la page d'index.
Est-ce que j'ai manqué quelque chose ici ?

207voto

dbr Points 66401

Voir le FAQ sur Sinatra ,

"Comment faire pour que mon application Sinatra se recharge en cas de changement ?"

Tout d'abord, le rechargement de code en cours de processus en Ruby est difficile et le fait d'avoir une solution qui fonctionne pour tous les scénarios est techniquement impossible.

C'est pourquoi nous vous recommandons de faire un rechargement hors processus.

Vous devez d'abord installer réexécuter si vous ne l'avez pas déjà fait :

 $ gem install rerun

Maintenant si vous démarrez votre application Sinatra comme ceci :

$ ruby app.rb

Tout ce que vous avez à faire pour le rechargement est plutôt de faire ceci :

$ rerun 'ruby app.rb'

Si vous utilisez par exemple rackup, faites plutôt ce qui suit :

$ rerun 'rackup'.

Vous voyez l'idée.

Si vous voulez toujours recharger en cours de fabrication, consultez le site Sinatra::Reloader .

0 votes

Shotgun nécessite un config.ru minimal. Si vous n'en avez pas déjà un, créez-le et mettez-y "require './my_app'" (où my_app.rb est votre application ruby) et vous serez prêt.

0 votes

Petit complément à pour rerun . Vous n'êtes pas limité aux options par défaut, à savoir rerun 'rackup' . Il est possible d'exécuter n'importe quel serveur sur n'importe quel port. Voici un exemple pour faire fonctionner Puma sur le port 5678. rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'

44voto

Nakilon Points 11635

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Note il ne rechargera que les handlers sinatra (et, peut-être quelques commandes de configuration du serveur sinatra), mais pas les fichiers personnalisés, que vous devez recharger manuellement.

UPD après 9 ans : il semble qu'il soit déjà possible de recharger d'autres fichiers en utilisant also_reload , dont_reload y after_reload -- https://github.com/sinatra/sinatra/pull/1150

0 votes

Hey @Nakilon, comment dois-je procéder pour recharger ces fichiers manuellement ? Je suis en train de faire require "./my-file" sans succès

0 votes

@kristianlm, require ne recharge pas le fichier, s'il a déjà été requis. Vous load à la place.

0 votes

Vous avez raison. Je dois réenregistrer mon server.rb pour qu'il recharge mon fichier externe. Il ne vérifie pas uniquement mon fichier externe, je dois donc réenregistrer mon sever.rb à chaque fois que j'apporte une modification à mon fichier externe. fusil de chasse semble mieux fonctionner à cet égard, mais il semble aussi recharger les sessions de la base de données.

13voto

zeronone Points 197

Vous pouvez utiliser le rerun gemme.

gem install rerun
rerun 'ruby app.rb' 

OU si vous utilisez le rackup

rerun 'rackup'

9voto

rafidude Points 827

Gem install sinatra-reloader

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

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

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

Vous pouvez définir une variable d'environnement pour le développement et charger conditionnellement la gemme.

6voto

karmi Points 6213

Lorsque vous exécutez l'application avec Passager autonome il suffit de créer un tmp/always_restart fichier :

$ touch tmp/always_restart.txt

Voir Passager documentation pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X