ฉันใช้
# my_app.rb
load 'index.rb'
และเริ่มต้นเซิร์ฟเวอร์เช่นนี้
ruby my_app.rb
แต่จะไม่โหลดการเปลี่ยนแปลงใด ๆ ที่ฉันทำในหน้าดัชนีซ้ำ
ฉันพลาดอะไรที่นี่ไปหรือเปล่า?
ฉันใช้
# my_app.rb
load 'index.rb'
และเริ่มต้นเซิร์ฟเวอร์เช่นนี้
ruby my_app.rb
แต่จะไม่โหลดการเปลี่ยนแปลงใด ๆ ที่ฉันทำในหน้าดัชนีซ้ำ
ฉันพลาดอะไรที่นี่ไปหรือเปล่า?
คำตอบ:
"ฉันจะโหลดแอป Sinatra ซ้ำเมื่อมีการเปลี่ยนแปลงได้อย่างไร"
ก่อนอื่นการโหลดโค้ดใหม่ในกระบวนการใน Ruby นั้นยากและการมีโซลูชันที่ใช้ได้กับทุกสถานการณ์นั้นเป็นไปไม่ได้ในทางเทคนิค
นี่คือเหตุผลที่เราแนะนำให้คุณทำการโหลดซ้ำนอกกระบวนการ
ก่อนอื่นคุณต้องติดตั้งrerunหากคุณยังไม่ได้ทำ:
$ gem install rerunตอนนี้ถ้าคุณเริ่มแอป Sinatra ของคุณเช่นนี้:
$ ruby app.rbสิ่งที่คุณต้องทำในการโหลดซ้ำคือทำสิ่งนี้แทน:
$ rerun 'ruby app.rb'หากคุณกำลังใช้แร็คอัพให้ทำดังต่อไปนี้แทน:
$ rerun 'แร็คอัพ'
คุณจะได้รับความคิด
Sinatra::Reloaderถ้าคุณยังต้องการในกระบวนการโหลดตรวจสอบ
rerunนอกจากนี้ขนาดเล็กสำหรับ คุณยังไม่ได้ จำกัด rerun 'rackup'อยู่กับตัวเลือกเริ่มต้นคือ สามารถรันเซิร์ฟเวอร์บนพอร์ตใดก็ได้ นี่คือตัวอย่างวิธีเรียกใช้ Puma บนพอร์ตหมายเลข 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
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
require "./my-file"ไม่สำเร็จ
requireไม่โหลดไฟล์ซ้ำหากจำเป็นอยู่แล้ว คุณloadแทน
server.rbเพื่อให้มันโหลดไฟล์ภายนอกของฉันใหม่ ไม่ได้ตรวจสอบไฟล์ภายนอกของฉันเพียงอย่างเดียวดังนั้นฉันต้องบันทึกใหม่sever.rbทุกครั้งที่เปลี่ยนแปลงไฟล์ภายนอก ปืนลูกซองดูเหมือนจะทำงานได้ดีขึ้นในเรื่องนี้ แต่ดูเหมือนว่าจะโหลดเซสชันฐานข้อมูลอีกครั้ง
configure :development do |c| require 'sinatra/reloader' c.also_reload "./lib/*.rb" c.also_reload "./controllers/*.rb" c.also_reload "./init/*.rb" end
คุณสามารถใช้rerunอัญมณี
gem install rerun
rerun 'ruby app.rb'
หรือหากคุณใช้แร็คอัพ
rerun 'rackup'
gem ติดตั้ง sinatra-reloader
require 'sinatra/base'
require "sinatra/reloader"
class MyApp < Sinatra::Base
register Sinatra::Reloader
get '/' do
"Hello Testing1!"
end
end
คุณอาจต้องการตั้งค่าตัวแปรสภาพแวดล้อมในการพัฒนาและโหลดอัญมณีตามเงื่อนไข
เมื่อคุณเรียกใช้แอปพลิเคชันด้วยPassenger Standaloneเพียงสร้างtmp/always_restartไฟล์:
$ touch tmp/always_restart.txt
ดูเอกสารสำหรับผู้โดยสารสำหรับข้อมูลเพิ่มเติม
ใน Windows ฉันใช้อัญมณีเริ่มต้นของฉันสำหรับสิ่งนี้:
restart ruby my_app.rb
หรือด้วยแร็คอัพ:
restart rackup
ดูข้อมูลเพิ่มเติมที่นี่หวังว่าจะเป็นประโยชน์
คุณสามารถใช้ชั้นป้องกัน ยกมาจากบทความที่ 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จะโหลดซ้ำทุกครั้ง
หากคุณเปลี่ยนแม่แบบเท่านั้นซินาตร้าจะแสดงผลเสมอหากคุณตั้งค่าสภาพแวดล้อมเป็นการพัฒนา:
ruby app.rb -e development