8

このスレッドRack::Reloadに従って設定しました

# 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

thin viathin start -R config.ruで実行していますが、新しく追加されたルートのみをリロードします。既存のルートを変更しても、古いコードが引き続き実行されます。

新しいルートを追加すると、正しくリロードされるため、アクセスできますが、他には何もリロードしません。

たとえば、ルートを次のように変更した場合

get '/' do
  'bar'
end

get '/foo' do
  'baz'
end

それが変更されたとしても、/引き続き を提供しますが、正しくリロードして を提供します。foo/foobaz

これは正常な動作ですか、それとも何か不足していますか? ソースファイル全体がリロードされると思います。今考えられる唯一の方法は、ファイルシステムが変更されたときに Web サーバー全体を再起動することです。

Windows Vista x64で実行しているため、fork().

4

4 に答える 4

21

Windows でうまく動作することが知られているsinatra-reloaderを試すことができます (また、shotgun よりも高速です)。

于 2010-03-26T00:05:41.613 に答える
5

これは機能します:

# 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

require ステートメントがある場所から重要です。しかし、次のソリューションの方がエレガントで堅牢だと思います。

# 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
于 2010-04-07T00:01:40.197 に答える
0

Shotgunは Windows では動作しませんか?

README から:

                                Shotgun

これは、Rack に同梱されている Rackup コマンドの自動リロード バージョンです。これは、Web フレームワークによって提供される複雑なリロード ロジックの代わりとして、またはアプリケーションのリロードをサポートしていない環境で使用できます。

shotgun コマンドは、Rack がサポートするサーバー (mongrel、thin、webrick など) の 1 つを起動し、リクエストをリッスンしますが、実際のアプリケーションのどの部分もロードしません。リクエストを受信するたびに、フォークし、アプリケーションを子プロセスにロードし、リクエストを処理して、子プロセスを終了します。その結果、リクエストごとにすべてのソース ファイルとテンプレートがアプリケーション全体でクリーンにリロードされます。

于 2009-12-17T20:52:58.497 に答える
0

また、Tomcat ベースの JRuby Rack コンテナーであるTrinidadを使用することもできます。私の経験では、ソース ファイルを変更しなくても、デフォルトでリロードが変更されます。血も速い。ネイティブ ライブラリを使用している場合は明らかに良くありませんが、Windows にデプロイしている場合は、おそらく純粋な Ruby アプローチの採用に慣れているでしょう。

その構文は、thin アプローチと同じくらい単純です。

jruby -S trinidad -r config.ru

Java 固有の yak shaving (web.xml の作成や Ruby アプリの WAR など) はなく、gem は簡単にインストールできます。

于 2010-08-10T09:22:13.567 に答える