จะทำให้ Sinatra โหลดไฟล์ซ้ำโดยอัตโนมัติหลังจากการเปลี่ยนแปลงแต่ละครั้งได้อย่างไร?


118

ฉันใช้

# my_app.rb
load 'index.rb'

และเริ่มต้นเซิร์ฟเวอร์เช่นนี้

ruby my_app.rb

แต่จะไม่โหลดการเปลี่ยนแปลงใด ๆ ที่ฉันทำในหน้าดัชนีซ้ำ
ฉันพลาดอะไรที่นี่ไปหรือเปล่า?

คำตอบ:


203

ดูซินาตร้าคำถามที่พบบ่อย ,

"ฉันจะโหลดแอป Sinatra ซ้ำเมื่อมีการเปลี่ยนแปลงได้อย่างไร"

ก่อนอื่นการโหลดโค้ดใหม่ในกระบวนการใน Ruby นั้นยากและการมีโซลูชันที่ใช้ได้กับทุกสถานการณ์นั้นเป็นไปไม่ได้ในทางเทคนิค

นี่คือเหตุผลที่เราแนะนำให้คุณทำการโหลดซ้ำนอกกระบวนการ

ก่อนอื่นคุณต้องติดตั้งrerunหากคุณยังไม่ได้ทำ:

 $ gem install rerun

ตอนนี้ถ้าคุณเริ่มแอป Sinatra ของคุณเช่นนี้:

$ ruby app.rb

สิ่งที่คุณต้องทำในการโหลดซ้ำคือทำสิ่งนี้แทน:

$ rerun 'ruby app.rb'

หากคุณกำลังใช้แร็คอัพให้ทำดังต่อไปนี้แทน:

$ rerun 'แร็คอัพ'

คุณจะได้รับความคิด

Sinatra::Reloaderถ้าคุณยังต้องการในกระบวนการโหลดตรวจสอบ


ปืนลูกซองต้องการ config.ru ขั้นต่ำ หากคุณยังไม่มีให้สร้างและใส่ "ต้อง" ./my_app '"(โดยที่ my_app.rb คือแอปทับทิมของคุณ) และคุณจะได้รับการตั้งค่า
Jeffrey Martinez

rerunนอกจากนี้ขนาดเล็กสำหรับ คุณยังไม่ได้ จำกัด rerun 'rackup'อยู่กับตัวเลือกเริ่มต้นคือ สามารถรันเซิร์ฟเวอร์บนพอร์ตใดก็ได้ นี่คือตัวอย่างวิธีเรียกใช้ Puma บนพอร์ตหมายเลข 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

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


เฮ้ @ Nakilon ฉันจะโหลดไฟล์ซ้ำด้วยตนเองได้อย่างไร ฉันทำrequire "./my-file"ไม่สำเร็จ
kristianlm

@kristianlm requireไม่โหลดไฟล์ซ้ำหากจำเป็นอยู่แล้ว คุณloadแทน
Nakilon

คุณพูดถูก ฉันต้องบันทึกอีกครั้งserver.rbเพื่อให้มันโหลดไฟล์ภายนอกของฉันใหม่ ไม่ได้ตรวจสอบไฟล์ภายนอกของฉันเพียงอย่างเดียวดังนั้นฉันต้องบันทึกใหม่sever.rbทุกครั้งที่เปลี่ยนแปลงไฟล์ภายนอก ปืนลูกซองดูเหมือนจะทำงานได้ดีขึ้นในเรื่องนี้ แต่ดูเหมือนว่าจะโหลดเซสชันฐานข้อมูลอีกครั้ง
kristianlm

9
ใช้เมธอด also_reload เพื่อระบุไฟล์ที่จะโหลดใหม่: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

คุณสามารถใช้rerunอัญมณี

gem install rerun
rerun 'ruby app.rb' 

หรือหากคุณใช้แร็คอัพ

rerun 'rackup'

8

gem ติดตั้ง sinatra-reloader

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

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

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

คุณอาจต้องการตั้งค่าตัวแปรสภาพแวดล้อมในการพัฒนาและโหลดอัญมณีตามเงื่อนไข


6

เมื่อคุณเรียกใช้แอปพลิเคชันด้วยPassenger Standaloneเพียงสร้างtmp/always_restartไฟล์:

$ touch tmp/always_restart.txt

ดูเอกสารสำหรับผู้โดยสารสำหรับข้อมูลเพิ่มเติม


5

ฉันชอบอัญมณี Shotgun หากคุณใช้แอป Sinatra แบบโมดูลาร์และมีไฟล์ config.ru คุณสามารถเรียกใช้งานได้ง่าย

shotgun config.ru

ตรวจสอบอัญมณีออกจากที่นี่ ค่อนข้างตรงไปตรงมาและไม่จำเป็นต้องกำหนดค่าใด ๆ


4

ใน Windows ฉันใช้อัญมณีเริ่มต้นของฉันสำหรับสิ่งนี้:

restart ruby my_app.rb

หรือด้วยแร็คอัพ:

restart rackup

ดูข้อมูลเพิ่มเติมที่นี่หวังว่าจะเป็นประโยชน์


เอกสารระบุว่ามันใช้ไม่ได้บน windows ฉันลองแล้วมันโหลด sinatra แต่ไม่โหลดซ้ำบน chenges
เตอร์

1

คุณสามารถใช้ชั้นป้องกัน ยกมาจากบทความที่ 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จะโหลดซ้ำทุกครั้ง


0

หากคุณเปลี่ยนแม่แบบเท่านั้นซินาตร้าจะแสดงผลเสมอหากคุณตั้งค่าสภาพแวดล้อมเป็นการพัฒนา:

ruby app.rb -e development
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.