Jak sprawić, by Sinatra automatycznie przeładowywał plik po każdej zmianie?

118

ja używam

# my_app.rb
load 'index.rb'

i uruchom serwer w ten sposób

ruby my_app.rb

ale nigdy nie ładuje ponownie żadnych zmian, które wprowadziłem na stronie indeksu.
Czy coś tu przegapiłem?

ez.
źródło

Odpowiedzi:

203

Zobacz Sinatra FAQ ,

„Jak mogę ponownie załadować moją aplikację Sinatra po zmianach?”

Po pierwsze, ponowne ładowanie kodu w trakcie procesu w Rubim jest trudne, a posiadanie rozwiązania działającego w każdym scenariuszu jest technicznie niemożliwe.

Dlatego zalecamy przeładowywanie poza procesem.

Najpierw musisz zainstalować ponownie, jeśli jeszcze tego nie zrobiłeś:

 $ gem install rerun

Teraz, jeśli uruchomisz aplikację Sinatra w ten sposób:

$ ruby app.rb

Zamiast tego wystarczy wykonać następujące czynności:

$ rerun 'ruby app.rb'

Jeśli na przykład używasz kopii zapasowej, wykonaj następujące czynności:

$ rerun 'rackup'

Masz pomysł.

Jeśli nadal chcesz przeładować w trakcie procesu, sprawdź Sinatra::Reloader.

dbr
źródło
strzelba wymaga minimalnego config.ru. Jeśli jeszcze go nie masz, utwórz go i umieść w nim "require './my_app'" (gdzie my_app.rb to twoja aplikacja ruby), a zostaniesz ustawiony.
Jeffrey Martinez
Mały dodatek do za rerun. Nie jesteś ograniczony domyślnymi opcjami, tj rerun 'rackup'. Możliwe jest uruchomienie dowolnego serwera na dowolnym porcie. Oto przykład, jak uruchomić Pumę na porcie numer 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov
43

gem zainstaluj sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Uwaga : przeładuje tylko programy obsługi sinatry (i być może niektóre komendy konfiguracyjne serwera sinatra), ale nie pliki niestandardowe, które trzeba przeładować ręcznie.

UPD po 9 latach: Wygląda na to, że jest już możliwe, aby przeładować innych plików za pomocą also_reload, dont_reloadi after_reload- https://github.com/sinatra/sinatra/pull/1150

Nakilon
źródło
Hej @Nakilon, jak mógłbym ręcznie załadować takie pliki ponownie? Radzę sobie require "./my-file"bez sukcesu
kristianlm
@kristianlm, requirenie ładuje ponownie pliku, jeśli był już wymagany. Ty loadzamiast tego.
Nakilon
masz rację. Muszę jednak ponownie zapisać mój server.rbplik, aby ponownie załadował mój zewnętrzny plik. Nie sprawdza samego pliku zewnętrznego, więc muszę ponownie zapisywać mój za sever.rbkażdym razem, gdy wprowadzam zmiany w moim zewnętrznym pliku. strzelba wydaje się działać lepiej pod tym względem, ale wydaje się również, że ponownie ładuje sesje bazy danych.
kristianlm
9
Użyj metody also_reload, aby określić, które pliki mają zostać załadowane ponownie: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

Możesz użyć rerunklejnotu.

gem install rerun
rerun 'ruby app.rb' 

LUB jeśli używasz kopii zapasowej

rerun 'rackup'
zeronone
źródło
8

gem zainstaluj sinatra-reloader

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

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

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

Możesz ustawić zmienną środowiskową na programowanie i warunkowo załadować klejnot.

rafidude
źródło
6

Kiedy uruchamiasz aplikację z Passenger Standalone , po prostu utwórz tmp/always_restartplik:

$ touch tmp/always_restart.txt

Więcej informacji można znaleźć w dokumentacji pasażera .

karmi
źródło
5

Podoba mi się klejnot Shotgun. Jeśli używasz modułowej aplikacji Sinatra i masz plik config.ru, jest ona łatwa do uruchomienia.

shotgun config.ru

Sprawdź klejnot tutaj . Jest to dość proste i nie wymaga konfiguracji.


źródło
4

W systemie Windows używam mojego klejnotu restartu do tego:

restart ruby my_app.rb

lub z rackup:

restart rackup

Zobacz tutaj, aby uzyskać więcej informacji, mam nadzieję, że okażą się przydatne.

Vais Salikhov
źródło
dokumentacja stwierdza, że ​​nie działa w systemie Windows, próbowałem i ładuje sinatrę, ale nie ładuje się ponownie na chenges
peter
1

Możesz użyć stelaża. Zaczerpnięte z artykułu na dblock.org :

Dodaj to do swojego Gemfile:

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

Następnie utwórz Guardfilew katalogu głównym swojego projektu następującą zawartość:

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

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

Na koniec uruchom Guard, w ten sposób: bundle exec guardi rackupbędzie ładował się za każdym razem.

jeffbyrnes
źródło
0

Jeśli zmienisz tylko swoje szablony, sinatra zawsze je wyśle, jeśli ustawisz środowisko na programowanie:

ruby app.rb -e development
trzy
źródło