Як змусити Sinatra автоматично перезавантажувати файл після кожної зміни?


118

я використовую

# my_app.rb
load 'index.rb'

і почати так, як саме

ruby my_app.rb

але він ніколи не перезавантажує будь-які зміни, внесені в індексну сторінку.
Я щось тут пропустив?

Відповіді:


203

Див. Поширені питання про Сінатру ,

"Як зробити так, щоб мій додаток Sinatra перезавантажив зміни?"

По-перше, перезавантаження коду під час роботи в Ruby є важким, а рішення, яке працює для кожного сценарію, технічно неможливо.

Ось чому ми рекомендуємо вам робити поза-перезавантаження.

Спочатку потрібно встановити перезапуск, якщо ви ще цього не зробили:

 $ gem install rerun

Тепер якщо ви запускаєте додаток Сінатра так:

$ ruby app.rb

Все, що вам потрібно зробити для перезавантаження, це зробити це:

$ rerun 'ruby app.rb'

Якщо ви, наприклад, використовуєте rackup, замість цього виконайте такі дії:

$ rerun 'стійка'

Ви отримуєте ідею.

Якщо ви все ще хочете в процесі перезавантаження, перевірте Sinatra::Reloader.


Для рушниці потрібен мінімальний config.ru. Якщо у вас його ще немає, створіть його і поставте в нього "вимагаю" ./my_app '"(де my_app.rb - ваш додаток для рубіну), і ви будете встановлені.
Джеффрі Мартінес

Невелике доповнення для rerun. Ви не обмежені опціями за замовчуванням, тобто rerun 'rackup'. Можна запустити будь-який сервер на будь-якому порту. Ось приклад, як запустити Puma на номер порту 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem встановити sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Примітка : він буде завантажувати лише обробники sinatra (і, можливо, деякі команди конфігурації сервера sinatra), але не власні файли, які вам доведеться перезавантажувати вручну.

UPD через 9 років: здається, що вже можна перезавантажувати інші файли за допомогою also_reload, dont_reloadі after_reload- https://github.com/sinatra/sinatra/pull/1150


Привіт @Nakilon, як би я міг про перезавантаження таких файлів вручну? Я роблю require "./my-file"без успіху
kristianlm

@kristianlm, requireне завантажує файл, якщо це вже було потрібно. Ви loadнатомість.
Накілон

ти правий. Я маю повторно зберегти свій server.rb, щоб отримати його для перезавантаження мого зовнішнього файлу. Він не перевіряє мій зовнішній файл один, тому мені доведеться повторно зберігати sever.rbкожен раз, коли я вношу зміни до свого зовнішнього файлу. Здається, рушниця працює в цьому плані краще, але, здається, також перезавантажує сеанси бази даних.
kristianlm

9
Використовуйте метод also_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

12

Можна використовувати rerunсамоцвіт.

gem install rerun
rerun 'ruby app.rb' 

АБО якщо ви використовуєте стелаж

rerun 'rackup'

8

gem встановити sinatra-reloader

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

class MyApp < Sinatra::Base
  register Sinatra::Reloader

  get '/' do
    "Hello Testing1!"
  end
end

Ви можете встановити змінну середовища для розробки та умовно завантажувати дорогоцінний камінь.



5

Мені подобається дорогоцінний камінь Shotgun. Якщо ви використовуєте модульний додаток Sinatra і маєте файл config.ru, його легко запустити.

shotgun config.ru

Ознайомтеся з дорогоцінним каменем тут . Він досить прямий вперед і не потрібна конфігурація.


4

Для Windows я використовую для цього свій дорогоцінний камінь :

restart ruby my_app.rb

або, за допомогою стійки:

restart rackup

Дивіться тут для отримання додаткової інформації, сподіваємось, вам здається корисною.


У документації зазначено, що він не працює на windows, я намагався, і він завантажує синатру, але не завантажує на chenges
peter

1

Ви можете використовувати охоронну стійку. Піднято зі статті на dblock.org :

Додайте це до свого Gemfile:

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

Потім створіть Guardfileу корені свого проекту цей вміст:

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

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

Нарешті, запустіть Guard, як так: bundle exec guardі rackupперезавантажуватиметься кожного разу.


0

Якщо ви зміните лише свої шаблони, sinatra завжди буде відтворювати їх, якщо ви налаштовуєте своє середовище на розвиток:

ruby app.rb -e development
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.