123

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?

Nakilon
  • 34,866
  • 14
  • 107
  • 142
ez.
  • 7,604
  • 5
  • 30
  • 29

9 Answers9

213

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.

dbr
  • 165,801
  • 69
  • 278
  • 343
  • shotgun requires a minimal config.ru. If you don't have one already, create it and put "require './my_app'" (where my_app.rb is your ruby app) in it and you'll be set. – Jeffrey Martinez Jan 12 '14 at 09:10
  • Small addition to for `rerun`. You are not limited with default options i.e. `rerun 'rackup'`. It's possible to run any server on any port. Here is example how to run Puma on port number 5678 — `rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'` – sashaegorov Oct 28 '15 at 17:26
45

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

Nakilon
  • 34,866
  • 14
  • 107
  • 142
  • Hey @Nakilon, how would I go about re-loading such files manually? I am doing `require "./my-file"` without success – kristianlm Sep 30 '11 at 21:23
  • @kristianlm, `require` doesn't reload file, if it already was required. You `load` instead. – Nakilon Oct 01 '11 at 10:59
  • you are right. I have to re-save my `server.rb`, though, to get it to reload my external file. It doesn't check my external file alone, so I have to re-save my `sever.rb` every time I make a change to my external file. [shotgun](http://rubygems.org/gems/shotgun) seems to work better in this regard, but it also seems to re-load the database sessions. – kristianlm Oct 05 '11 at 12:44
  • 9
    Use the also_reload method to specify which files to reload: `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 Apr 27 '13 at 16:25
14

You can use the rerun gem.

gem install rerun
rerun 'ruby app.rb' 

OR if you are using rackup

rerun 'rackup'
zeronone
  • 2,912
  • 25
  • 28
11

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.

rafidude
  • 4,496
  • 7
  • 27
  • 23
6

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.

karmi
  • 14,059
  • 3
  • 33
  • 41
5

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.

4

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.

  • the documentation states that it doesn't work on windows, i tried and it loads sinatra but doesn't reload on chenges – peter Apr 20 '15 at 09:10
1

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.

jeffbyrnes
  • 2,182
  • 2
  • 22
  • 33
0

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

ruby app.rb -e development
three
  • 8,262
  • 3
  • 35
  • 39