ฉันใช้
# 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