Làm thế nào để Sinatra tự động tải lại tệp sau mỗi lần thay đổi?


118

tôi đang dùng

# my_app.rb
load 'index.rb'

và bắt đầu máy chủ như thế này

ruby my_app.rb

nhưng nó không bao giờ tải lại bất kỳ thay đổi nào tôi đã thực hiện trong trang chỉ mục.
Tôi đã bỏ lỡ bất cứ điều gì ở đây?

Câu trả lời:


203

Xem Câu hỏi thường gặp về Sinatra ,

"Làm cách nào để tải lại ứng dụng Sinatra khi có các thay đổi?"

Trước hết, việc tải lại mã trong quá trình trong Ruby là rất khó và việc có một giải pháp phù hợp với mọi tình huống là không thể về mặt kỹ thuật.

Đó là lý do tại sao chúng tôi khuyên bạn nên thực hiện tải lại ngoài quy trình.

Trước tiên, bạn cần cài đặt chạy lại nếu chưa:

 $ gem install rerun

Bây giờ nếu bạn khởi động ứng dụng Sinatra của mình như thế này:

$ ruby app.rb

Thay vào đó, tất cả những gì bạn phải làm để tải lại là:

$ rerun 'ruby app.rb'

Nếu bạn đang sử dụng rackup chẳng hạn, hãy làm như sau:

$ chạy lại 'rackup'

Bạn có được ý tưởng.

Nếu bạn vẫn muốn tải lại trong quá trình, hãy kiểm tra Sinatra::Reloader.


shotgun yêu cầu cấu hình tối thiểu. Nếu bạn chưa có, hãy tạo nó và đặt "request './my_app'" (trong đó my_app.rb là ứng dụng ruby ​​của bạn) vào đó và bạn sẽ được thiết lập.
Jeffrey Martinez

Bổ sung nhỏ cho rerun. Bạn không bị giới hạn với các tùy chọn mặc định tức là rerun 'rackup'. Có thể chạy bất kỳ máy chủ nào trên bất kỳ cổng nào. Dưới đây là ví dụ làm thế nào để chạy Puma trên cổng số 5678 -rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

Lưu ý : nó sẽ chỉ tải lại các trình xử lý sinatra (và, có thể là một số lệnh cấu hình máy chủ sinatra), chứ không phải các tệp tùy chỉnh mà bạn phải tải lại theo cách thủ công.

UPD sau 9 năm: có vẻ như nó đã có thể tải lại file khác sử dụng also_reload, dont_reloadafter_reload- https://github.com/sinatra/sinatra/pull/1150


Xin chào @Nakilon, làm cách nào để tải lại các tệp như vậy theo cách thủ công? Tôi đang làm require "./my-file"nhưng không thành công
kristianlm

@kristianlm, requirekhông tải lại tệp nếu nó đã được yêu cầu. Bạn loadthay thế.
Nakilon

bạn đúng rồi. Tôi phải làm lại tiết kiệm của tôi server.rb, tuy nhiên, để có được nó để tải lại tập tin bên ngoài của tôi. Nó không kiểm tra tệp bên ngoài của tôi một mình, vì vậy tôi phải lưu lại sever.rbmỗi khi tôi thực hiện thay đổi đối với tệp bên ngoài của mình. shotgun dường như hoạt động tốt hơn về mặt này, nhưng nó cũng có vẻ như tải lại các phiên cơ sở dữ liệu.
kristianlm

9
Sử dụng phương pháp also_reload để xác định các tập tin để tải lại: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

Bạn có thể sử dụng rerunđá quý.

gem install rerun
rerun 'ruby app.rb' 

HOẶC nếu bạn đang sử dụng rackup

rerun 'rackup'

8

gem install sinatra-reloader

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

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

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

Bạn có thể muốn đặt biến môi trường thành phát triển và tải đá quý có điều kiện.



5

Tôi thích đá quý Shotgun. Nếu bạn đang sử dụng một ứng dụng Sinatra mô-đun và có tệp config.ru, bạn có thể dễ dàng chạy.

shotgun config.ru

Kiểm tra đá quý tại đây . Nó khá đơn giản và không cần cấu hình.


4

Trên Windows, tôi đang sử dụng đá quý khởi động lại của mình cho việc này:

restart ruby my_app.rb

hoặc, với rackup:

restart rackup

Xem ở đây để biết thêm thông tin, hy vọng bạn thấy nó hữu ích.


các tiểu bang tài liệu rằng nó không làm việc trên cửa sổ, tôi đã cố gắng và nó tải Sinatra nhưng không tải lại trên chenges
peter

1

Bạn có thể sử dụng giá đỡ. Lấy từ một bài báo tại dblock.org :

Thêm cái này vào Gemfile của bạn:

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

Sau đó, tạo Guardfileở gốc dự án của bạn với nội dung sau:

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

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

Cuối cùng, hãy chạy Guard, như sau :, bundle exec guardrackupsẽ tải lại mọi lúc.


0

Nếu bạn chỉ thay đổi các mẫu của mình, sinatra sẽ luôn hiển thị chúng nếu bạn đặt môi trường của mình thành phát triển:

ruby app.rb -e development
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.