How to get Sinatra to auto-reload the file after each change?

RubySinatra

Ruby Problem Overview


I am using

# my_app.rb
load 'index.rb'

and start the sever like this

ruby my_app.rb

but it never reload any changes I made in index page.
Did I miss anything here?

Ruby Solutions


Solution 1 - Ruby

See the Sinatra FAQ,

"How do I make my Sinatra app reload on changes?"

> First off, in-process code reloading in Ruby is hard and having a > solution that works for every scenario is technically impossible. > > Which is why we recommend you to do out-of-process reloading. > > First you need to install rerun if you haven’t already: > > $ gem install rerun > > Now if you start your Sinatra app like this: > > $ ruby app.rb > > All you have to do for reloading is instead do this: > > $ rerun 'ruby app.rb' > > If you are for instance using rackup, instead do > the following: > > $ rerun 'rackup' > > You get the idea. > > If you still want in-process reloading, check out Sinatra::Reloader.

Solution 2 - Ruby

>gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Note: it will reload only sinatra handlers (and, maybe some sinatra server configuration commands), but not custom files, which you have to reload manually.

UPD after 9 years: seems like it is already possible to reload other files using also_reload, dont_reload and after_reload -- https://github.com/sinatra/sinatra/pull/1150

Solution 3 - Ruby

You can use the rerun gem.

gem install rerun
rerun 'ruby app.rb' 

OR if you are using rackup

rerun 'rackup'

Solution 4 - Ruby

gem install sinatra-reloader

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

class MyApp < Sinatra::Base
  register Sinatra::Reloader
  
  get '/' do
    "Hello Testing1!"
  end
end

You may want to set environment variable to development and conditionally load the gem.

Solution 5 - Ruby

When you run the application with Passenger Standalone, just create a tmp/always_restart file:

$ touch tmp/always_restart.txt

See Passenger documentation for more info.

Solution 6 - Ruby

I like the Shotgun gem. If you're using a modular Sinatra app and have a config.ru file it's easy to run.

shotgun config.ru

Check the gem out here. It's fairly straight forward and no configuration needed.

Solution 7 - Ruby

On Windows, I am using my restart gem for this:

restart ruby my_app.rb

or, with rackup:

restart rackup

See here for more info, hope you find it useful.

Solution 8 - Ruby

You could use guard-rack. Lifted from an article at dblock.org:

Add this to your Gemfile:

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

Then, create a Guardfile at the root of your project with this content:

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

Lastly, run Guard, like so: bundle exec guard, and rackup will reload every time.

Solution 9 - Ruby

If you only change your templates sinatra will always rerender them if you set your environment to development:

ruby app.rb -e development

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionez.View Question on Stackoverflow
Solution 1 - RubydbrView Answer on Stackoverflow
Solution 2 - RubyNakilonView Answer on Stackoverflow
Solution 3 - RubyzerononeView Answer on Stackoverflow
Solution 4 - RubyrafidudeView Answer on Stackoverflow
Solution 5 - RubykarmiView Answer on Stackoverflow
Solution 6 - Rubyuser427390View Answer on Stackoverflow
Solution 7 - RubyVais SalikhovView Answer on Stackoverflow
Solution 8 - RubyjeffbyrnesView Answer on Stackoverflow
Solution 9 - RubythreeView Answer on Stackoverflow