Sinatra'nın her değişiklikten sonra dosyayı otomatik olarak yeniden yüklemesini nasıl sağlayabilirim?


118

Ben kullanıyorum

# my_app.rb
load 'index.rb'

ve sunucuya böyle başla

ruby my_app.rb

ancak indeks sayfasında yaptığım değişiklikleri asla yeniden yüklemiyor.
Burada bir şey özledim mi?

Yanıtlar:


203

Sinatra SSS bölümüne bakın ,

"Sinatra uygulamamın değişikliklerde yeniden yüklenmesini nasıl sağlayabilirim?"

Öncelikle, Ruby'de işlem içi kodun yeniden yüklenmesi zordur ve her senaryo için çalışan bir çözüme sahip olmak teknik olarak imkansızdır.

Bu nedenle işlem dışı yeniden yükleme yapmanızı öneririz.

Henüz yapmadıysanız, önce yeniden çalıştırmayı yüklemeniz gerekir :

 $ gem install rerun

Şimdi Sinatra uygulamanızı şöyle başlatırsanız:

$ ruby app.rb

Yeniden yüklemek için tek yapmanız gereken bunun yerine şunu yapmaktır:

$ rerun 'ruby app.rb'

Örneğin raf kullanıyorsanız, bunun yerine aşağıdakileri yapın:

$ rerun 'raket'

Kaptın bu işi.

Hala işlem içi yeniden yüklemeyi istiyorsanız, kontrol edin Sinatra::Reloader.


av tüfeği minimum config.ru gerektirir. Halihazırda bir tane yoksa, onu oluşturun ve içine "required './my_app'" (burada my_app.rb, Ruby uygulamanızdır) yazın ve ayarlanacaksınız.
Jeffrey Martinez

İçin küçük bir ek rerun. Varsayılan seçeneklerle sınırlı değilsiniz, yani rerun 'rackup'. Herhangi bir sunucuyu herhangi bir bağlantı noktasında çalıştırmak mümkündür. Puma'nın 5678 numaralı bağlantı noktasında nasıl çalıştırılacağına bir örnek -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem yüklemek sinatra-yeniden yükleyici

require 'sinatra'
require 'sinatra/reloader'

Not : Yalnızca sinatra işleyicilerini (ve belki bazı sinatra sunucu yapılandırma komutlarını) yeniden yükleyecektir, ancak manuel olarak yeniden yüklemeniz gereken özel dosyaları yüklemez.

9 yıl sonra UDP: o kullanan diğer dosyaları yeniden zaten mümkün gibi görünüyor also_reload, dont_reloadve after_reload- https://github.com/sinatra/sinatra/pull/1150


Hey @Nakilon, bu tür dosyaları manuel olarak yeniden yüklemeye nasıl gidebilirim? require "./my-file"Başarısız yapıyorum
kristianlm

@kristianlm, requirezaten gerekliyse dosyayı yeniden yüklemez. Onun loadyerine sen .
Nakilon

Haklısın. server.rbHarici dosyamı yeniden yüklemek için yine de yeniden kaydetmem gerekiyor . Harici dosyamı tek başına kontrol etmiyor, bu yüzden harici dosyamda sever.rbher değişiklik yaptığımda yeniden kaydetmem gerekiyor . shotgun bu konuda daha iyi çalışıyor gibi görünüyor, ancak aynı zamanda veritabanı oturumlarını yeniden yüklüyor gibi görünüyor.
kristianlm

9
Hangi dosyaların yeniden yükleneceğini belirtmek için de_reload yöntemini kullanın: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

Cevheri kullanabilirsiniz rerun.

gem install rerun
rerun 'ruby app.rb' 

VEYA raf kullanıyorsanız

rerun 'rackup'

8

gem yüklemek sinatra-yeniden yükleyici

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

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

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

Geliştirme için ortam değişkenini ayarlamak ve mücevheri koşullu olarak yüklemek isteyebilirsiniz.



5

Av Tüfeği mücevherini seviyorum. Modüler bir Sinatra uygulaması kullanıyorsanız ve bir config.ru dosyanız varsa, çalıştırması kolaydır.

shotgun config.ru

Buradaki cevheri kontrol edin . Oldukça basittir ve konfigürasyona gerek yoktur.


4

Windows'ta bunun için yeniden başlatma gemimi kullanıyorum :

restart ruby my_app.rb

veya rackup ile:

restart rackup

Daha fazla bilgi için buraya bakın , umarım yararlı bulursunuz.


dokümantasyon, pencerelerde çalışmadığını, denedim ve sinatra'yı yüklediğini ancak chenges'e yeniden yüklenmediğini söylüyor
peter

1

Güvenlik askısı kullanabilirsin. Dblock.org'daki bir makaleden kaldırıldı :

Bunu Gemfile'ınıza ekleyin:

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

Ardından, Guardfilebu içerikle projenizin kökünde bir oluşturun :

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

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

Son olarak, Guard'ı şu şekilde çalıştırın: bundle exec guardve rackupher seferinde yeniden yüklenecektir.


0

Yalnızca şablonlarınızı değiştirirseniz, ortamınızı geliştirmeye ayarlarsanız sinatra her zaman onları yeniden gönderir:

ruby app.rb -e development
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.