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

118

j'utilise

# my_app.rb
load 'index.rb'

et démarrez le serveur comme ça

ruby my_app.rb

mais il ne recharge jamais les modifications que j'ai faites dans la page d'index.
Ai-je manqué quelque chose ici?

ez.
la source

Réponses:

203

Voir la FAQ Sinatra ,

"Comment puis-je recharger mon application Sinatra après les modifications?"

Tout d'abord, le rechargement de code en cours dans Ruby est difficile et il est techniquement impossible de disposer d'une solution qui fonctionne pour chaque scénario.

C'est pourquoi nous vous recommandons d'effectuer un rechargement hors processus.

Vous devez d'abord installer la réexécution 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 recharger est à la place de faire ceci:

$ rerun 'ruby app.rb'

Si vous utilisez par exemple le rackup, procédez comme suit:

$ réexécuter 'rackup'

Vous avez eu l'idée.

Si vous souhaitez toujours un rechargement en cours, vérifiez Sinatra::Reloader.

dbr
la source
fusil de chasse nécessite un config.ru minimal. Si vous n'en avez pas déjà un, créez-le et mettez "require './my_app'" (où my_app.rb est votre application ruby) et vous serez défini.
Jeffrey Martinez
Petit ajout à pour rerun. Vous n'êtes pas limité avec les options par défaut, c'est-à-dire rerun 'rackup'. Il est possible d'exécuter n'importe quel serveur sur n'importe quel port. Voici un exemple comment exécuter Puma sur le numéro de port 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov
43

gem installer sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Remarque : il ne rechargera que les gestionnaires sinatra (et, peut-être certaines 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_reloadet after_reload- https://github.com/sinatra/sinatra/pull/1150

Nakilon
la source
Hé @Nakilon, comment pourrais-je recharger ces fichiers manuellement? Je fais require "./my-file"sans succès
kristianlm
@kristianlm, requirene recharge pas le fichier, s'il était déjà requis. Vous à la loadplace.
Nakilon
vous avez raison. server.rbCependant, je dois réenregistrer mon fichier pour qu'il recharge mon fichier externe. Il ne vérifie pas mon fichier externe seul, je dois donc le réenregistrer sever.rbchaque fois que j'apporte une modification à mon fichier externe. shotgun semble mieux fonctionner à cet égard, mais il semble également recharger les sessions de la base de données.
kristianlm
9
Utilisez la méthode also_reload pour spécifier les fichiers à recharger:configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
Opptatt Jobber
12

Vous pouvez utiliser la rerungemme.

gem install rerun
rerun 'ruby app.rb' 

OU si vous utilisez rackup

rerun 'rackup'
zéronone
la source
8

gem installer 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 la variable d'environnement sur développement et charger conditionnellement le gem.

rafidude
la source
5

J'aime le bijou Shotgun. Si vous utilisez une application Sinatra modulaire et que vous avez un fichier config.ru, il est facile à exécuter.

shotgun config.ru

Découvrez le bijou ici . C'est assez simple et aucune configuration n'est nécessaire.


la source
4

Sous Windows, j'utilise ma gemme de redémarrage pour cela:

restart ruby my_app.rb

ou, avec rackup:

restart rackup

Voir ici pour plus d'informations, j'espère que vous le trouverez utile.

Vais Salikhov
la source
la documentation indique que cela ne fonctionne pas sur Windows, j'ai essayé et il charge sinatra mais ne se recharge pas sur chenges
peter
1

Vous pouvez utiliser garde-rack. Tiré d'un article sur dblock.org :

Ajoutez ceci à votre Gemfile:

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

Ensuite, créez un Guardfileà la racine de votre projet avec ce contenu:

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

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

Enfin, lancez Guard, comme ceci :, bundle exec guardet rackuprechargera à chaque fois.

Jeffbyrnes
la source
0

Si vous ne modifiez que vos modèles, sinatra les rendra toujours si vous définissez votre environnement en développement:

ruby app.rb -e development
Trois
la source