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?

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.


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


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'

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.



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.


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.