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

9

124

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?

Aguish answered 7/8, 2009 at 21:34 Comment(0)
A
214

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.

Amelita answered 8/8, 2009 at 10:31 Comment(2)
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.Compendium
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'Kikelia
W
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

Womenfolk answered 20/10, 2010 at 16:49 Comment(4)
Hey @Nakilon, how would I go about re-loading such files manually? I am doing require "./my-file" without successRavishing
@kristianlm, require doesn't reload file, if it already was required. You load instead.Womenfolk
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 seems to work better in this regard, but it also seems to re-load the database sessions.Ravishing
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" endKreis
M
14

You can use the rerun gem.

gem install rerun
rerun 'ruby app.rb' 

OR if you are using rackup

rerun 'rackup'
Memorial answered 24/1, 2013 at 4:52 Comment(0)
R
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.

Roi answered 9/9, 2011 at 19:54 Comment(0)
S
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.

Seibold answered 18/11, 2011 at 18:13 Comment(0)
B
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.

Bainite answered 30/9, 2014 at 22:25 Comment(1)
Shotgun is nice but isn't compatible with ruby 3+.Uniliteral
C
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.

Conclusion answered 23/9, 2014 at 14:14 Comment(1)
the documentation states that it doesn't work on windows, i tried and it loads sinatra but doesn't reload on chengesGerdy
A
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.

Axel answered 24/4, 2014 at 17:25 Comment(0)
D
0

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

ruby app.rb -e development
Damaging answered 14/10, 2017 at 11:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.