2009-12-17 29 views
8

tôi đã thiết lập Rack::Reload theo này threadứng dụng Reloading Sinatra trên tất cả các yêu cầu trên Windows

# config.ru 
require 'rubygems' 
require 'sinatra' 

set :environment, :development 

require 'app' 
run Sinatra::Application 

# app.rb 
class Sinatra::Reloader < Rack::Reloader 
    def safe_load(file, mtime, stderr = $stderr) 
    if file == Sinatra::Application.app_file 
     ::Sinatra::Application.reset! 
     stderr.puts "#{self.class}: reseting routes" 
    end 
    super 
    end 
end 

configure(:development) { use Sinatra::Reloader } 

get '/' do 
    'foo' 
end 

Chạy với mỏng qua thin start -R config.ru, nhưng nó chỉ tải lại các tuyến đường mới được bổ sung. Khi tôi thay đổi tuyến đường hiện tại, nó vẫn chạy mã cũ.

Khi tôi thêm tuyến mới, nó tải lại chính xác nó, vì vậy nó có thể truy cập được, nhưng nó không tải lại bất cứ thứ gì khác.

Ví dụ, nếu tôi thay đổi tuyến đường đến

get '/' do 
    'bar' 
end 

get '/foo' do 
    'baz' 
end 

Thần / vẫn sẽ phục vụ foo, mặc dù nó đã thay đổi, nhưng /foo sẽ tải lại một cách chính xác và phục vụ baz.

Đây có phải là hành vi bình thường không, hoặc tôi đang thiếu thứ gì đó? Tôi mong đợi toàn bộ tệp nguồn sẽ được tải lại. Cách duy nhất xung quanh tôi có thể nghĩ ngay bây giờ là khởi động lại toàn bộ máy chủ web khi thay đổi hệ thống tập tin.

Tôi đang chạy trên Windows Vista x64, vì vậy tôi không thể sử dụng shotgunfork().

Trả lời

0

Shotgun không hoạt động trên Windows không?

Từ README:

       Shotgun 

Đây là phiên bản nạp lại tự động của lệnh rackup đó là vận chuyển với rack. Nó có thể được sử dụng như là một thay thế cho logic tải lại phức tạp được cung cấp bởi các khung công tác web hoặc trong các môi trường không hỗ trợ tải lại ứng dụng.

Lệnh shotgun bắt đầu một trong các máy chủ được hỗ trợ của Rack (ví dụ: mongrel, thin, webrick) và lắng nghe yêu cầu nhưng không tải bất kỳ phần nào của ứng dụng thực tế. Mỗi lần nhận được yêu cầu, nó sẽ nạp tiền, tải ứng dụng vào quy trình con, xử lý yêu cầu và thoát khỏi tiến trình con. Kết quả sạch sẽ, tải lại toàn bộ tất cả các tệp nguồn và mẫu trên mỗi yêu cầu.

+0

Rất tiếc, không thấy ghi chú của bạn về Shotgun –

21

Bạn có thể thử sinatra-reloader, được biết là hoạt động tốt trên Windows (cũng nhanh hơn súng ngắn).

+0

Cuộc bỏ phiếu xuống là gì? –

+1

Chúng tôi đã có vấn đề này chính mình, kể từ khi hai của nhóm của tôi sử dụng Windows, và hai là trên máy Mac. Đây là giải pháp chúng tôi đã thực hiện, dường như đang hoạt động tốt cho đến nay. –

+2

không chỉ nhanh hơn nhưng tôi thấy sinatra-reloader dễ sử dụng hơn :-) – Radek

5

này hoạt động:

# config.ru 
require 'rubygems' 
require 'app' 

set :environment, :development 
run Sinatra::Application 

# app.rb 
require 'sinatra' 

class Sinatra::Reloader < Rack::Reloader 
    def safe_load(file, mtime, stderr = $stderr) 
    if file == File.expand_path(Sinatra::Application.app_file) 
     ::Sinatra::Application.reset! 
     stderr.puts "#{self.class}: reseting routes" 
    end 
    super 
    end 
end 

configure(:development) { use Sinatra::Reloader } 

get '/' do 
    'foo' 
end 

Điều quan trọng từ nơi bạn có yêu cầu tuyên bố. Nhưng tôi thấy giải pháp sau thanh lịch và mạnh mẽ hơn:

# config.ru 
require 'rubygems' 
require 'sinatra' 
require 'rack/reloader' 
require 'app' 

set :environment, :development 

use Rack::Reloader, 0 if development? 
run Sinatra::Application 

# app.rb 
Sinatra::Application.reset! 
get '/' do 
    'foo' 
end 
+0

Hoàn hảo! Đối với một ứng dụng mô-đun, chạy MyAppClassName (config.ru) và bao gồm Sinatra :: Application.reset! trong lớp ứng dụng (app.rb). – aaandre

0

Bạn cũng có thể thử sử dụng Trinidad thùng chứa giá JRuby dựa trên Tomcat. Theo kinh nghiệm của tôi, nó thay đổi tải lại theo mặc định mà không phải sửa đổi các tệp nguồn của bạn. Đẫm máu nhanh quá. Rõ ràng là không tốt nếu bạn đang sử dụng thư viện bản địa, nhưng nếu bạn đang triển khai trên Windows, bạn có thể sử dụng phương pháp tiếp cận thuần khiết.

cú pháp của nó là chỉ đơn giản như cách tiếp cận mỏng:

jruby -S trinidad -r config.ru 

Không có Java cụ thể yak cạo (ví dụ: tạo web.xml hoặc Waring lên ứng dụng của Ruby của bạn) và viên ngọc rất đơn giản để cài đặt.

Các vấn đề liên quan