Bagaimana cara membuat Sinatra memuat ulang file secara otomatis setelah setiap perubahan?

118

saya menggunakan

# my_app.rb
load 'index.rb'

dan mulai memutuskan seperti ini

ruby my_app.rb

tetapi tidak pernah memuat ulang perubahan yang saya buat di halaman indeks.
Apakah saya melewatkan sesuatu di sini?

ez.
sumber

Jawaban:

203

Lihat FAQ Sinatra ,

"Bagaimana cara membuat aplikasi Sinatra saya memuat ulang saat ada perubahan?"

Pertama, pemuatan ulang kode dalam proses di Ruby itu sulit dan memiliki solusi yang berfungsi untuk setiap skenario secara teknis tidak mungkin.

Itulah mengapa kami menyarankan Anda untuk melakukan pemuatan ulang di luar proses.

Pertama, Anda perlu menginstal ulang jika Anda belum melakukannya:

 $ gem install rerun

Sekarang jika Anda memulai aplikasi Sinatra Anda seperti ini:

$ ruby app.rb

Yang harus Anda lakukan untuk memuat ulang adalah melakukan ini:

$ rerun 'ruby app.rb'

Jika Anda misalnya menggunakan rackup, lakukan hal berikut:

$ jalankan kembali 'rackup'

Anda mengerti.

Jika Anda masih ingin memuat ulang dalam proses, lihat Sinatra::Reloader.

dbr
sumber
senapan membutuhkan config.ru minimal. Jika Anda belum memilikinya, buatlah dan masukkan "require './my_app'" (di mana my_app.rb adalah aplikasi ruby ​​Anda) di dalamnya dan Anda akan disetel.
Jeffrey Martinez
Tambahan kecil untuk rerun. Anda tidak dibatasi dengan opsi default yaitu rerun 'rackup'. Dimungkinkan untuk menjalankan server apa pun di port apa pun. Berikut adalah contoh cara menjalankan Puma pada nomor port 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov
43

gem instal sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Catatan : ini hanya akan memuat ulang penangan sinatra (dan, mungkin beberapa perintah konfigurasi server sinatra), tetapi bukan file khusus, yang harus Anda muat ulang secara manual.

UPD setelah 9 tahun: sepertinya sudah memungkinkan untuk memuat ulang file lain menggunakan also_reload, dont_reloaddan after_reload- https://github.com/sinatra/sinatra/pull/1150

Nakilon
sumber
Hai @Nakilon, bagaimana cara saya memuat ulang file semacam itu secara manual? Saya melakukannya require "./my-file"tanpa hasil
kristianlm
@kristianlm, requiretidak memuat ulang file, jika sudah diperlukan. Anda loadsebagai gantinya.
Nakilon
kamu benar. Saya harus menyimpan ulang saya server.rb, untuk membuatnya memuat ulang file eksternal saya. Itu tidak memeriksa file eksternal saya sendiri, jadi saya harus menyimpan ulang sever.rbsetiap kali saya membuat perubahan pada file eksternal saya. shotgun tampaknya bekerja lebih baik dalam hal ini, tetapi tampaknya juga memuat ulang sesi database.
kristianlm
9
Gunakan metode also_reload untuk menentukan file mana yang akan dimuat ulang: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

Anda bisa menggunakan rerunpermata itu.

gem install rerun
rerun 'ruby app.rb' 

ATAU jika Anda menggunakan rackup

rerun 'rackup'
zeronone
sumber
8

gem instal sinatra-reloader

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

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

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

Anda mungkin ingin mengatur variabel lingkungan untuk pengembangan dan memuat permata secara bersyarat.

kasar
sumber
6

Saat Anda menjalankan aplikasi dengan Passenger Standalone , cukup buat tmp/always_restartfile:

$ touch tmp/always_restart.txt

Lihat dokumentasi penumpang untuk info lebih lanjut.

karmi
sumber
5

Saya suka permata Shotgun. Jika Anda menggunakan aplikasi Sinatra modular dan memiliki file config.ru, itu mudah dijalankan.

shotgun config.ru

Lihat permata di sini . Ini cukup mudah dan tidak perlu konfigurasi.


sumber
4

Di Windows, saya menggunakan permata restart saya untuk ini:

restart ruby my_app.rb

atau, dengan rak:

restart rackup

Lihat di sini untuk info lebih lanjut, semoga bermanfaat.

Vais Salikhov
sumber
dokumentasi menyatakan bahwa itu tidak berfungsi di windows, saya mencoba dan memuat sinatra tetapi tidak memuat ulang pada chenges
peter
1

Anda bisa menggunakan rak pelindung. Diangkat dari artikel di dblock.org :

Tambahkan ini ke Gemfile Anda:

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

Kemudian, buat Guardfiledi root proyek Anda dengan konten ini:

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

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

Terakhir, jalankan Guard, seperti:, bundle exec guarddan rackupakan dimuat ulang setiap saat.

jeffbyrnes
sumber
0

Jika Anda hanya mengubah template, sinatra akan selalu merendernya jika Anda mengatur lingkungan Anda untuk pengembangan:

ruby app.rb -e development
tiga
sumber