変更のたびにSinatraにファイルを自動再読み込みさせる方法は?


118

使ってます

# my_app.rb
load 'index.rb'

このようにサーバーを開始します

ruby my_app.rb

ただし、インデックスページで行った変更は再読み込みされません。
ここで何か見逃しましたか?

回答:


203

Sinatra FAQを参照してください

「変更時にSinatraアプリをリロードするにはどうすればよいですか?」

まず、Rubyでのインプロセスコードのリロードは困難であり、あらゆるシナリオで機能するソリューションを持つことは技術的に不可能です。

そのため、アウトプロセスの再読み込みを行うことをお勧めします。

まだ実行していない場合は、最初にrerunをインストールする必要があります。

 $ gem install rerun

次のようにSinatraアプリを起動すると:

$ ruby app.rb

リロードのためにあなたがしなければならないすべては代わりにこれをすることです:

$ rerun 'ruby app.rb'

たとえば、ラックアップを使用している場合は、代わりに次のようにします。

$ 'rackup'を再実行します

あなたはアイデアを得ます。

それでもインプロセスの再読み込みが必要な場合は、をチェックしてくださいSinatra::Reloader


shotgunには最小限のconfig.ruが必要です。まだ持っていない場合は、作成して「require './my_app'」(my_app.rbはルビアプリ)を入れてください。
Jeffrey Martinez

のための小さな追加rerun。デフォルトのオプション、つまりに制限されませんrerun 'rackup'。任意のポートで任意のサーバーを実行することが可能です。ここでは、ポート番号5678でプーマを実行する方法の例です-rerun 'rackup -s puma -p 5678 app/sinatra/config.ru'
sashaegorov

43

gem install sinatra-reloader

require 'sinatra'
require 'sinatra/reloader'

:sinatraハンドラー(およびおそらく一部のsinatraサーバー構成コマンド)のみが再ロードされますが、カスタムファイルは再ロードされないため、手動で再ロードする必要があります。

9年後UPD:使用して他のファイルを再読み込みすることは既に可能であるように思えるalso_reloaddont_reloadafter_reload- https://github.com/sinatra/sinatra/pull/1150


@Nakilonさん、このようなファイルを手動で再ロードするにはどうすればよいですか?私はrequire "./my-file"成功せずにやっています
kristianlm '30 / 09/30

@kristianlmは、requireファイルがすでに必要な場合、ファイルを再ロードしません。あなたloadの代わりに。
Nakilon、2011年

あなたが正しいです。server.rbただし、外部ファイルをリロードするには、を再保存する必要があります。外部ファイルだけをチェックするわけではないのでsever.rb、外部ファイルに変更を加えるたびに再保存する必要があります。この点では、shotgunの方がうまく機能しているようですが、データベースセッションを再ロードするようにも見えます。
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ジョバー

12

rerun宝石を使用することができます。

gem install rerun
rerun 'ruby app.rb' 

または、ラックアップを使用している場合

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

環境変数を開発に設定し、条件付きでgemをロードすることができます。



5

私はショットガンの宝石が好きです。モジュラーSinatraアプリを使用していて、config.ruファイルがある場合、簡単に実行できます。

shotgun config.ru

ここで宝石をチェックしてください。それはかなり単純で、設定は必要ありません。


4

Windowsでは、このために再起動宝石を使用しています。

restart ruby my_app.rb

または、ラックアップあり:

restart rackup

詳細はこちらをご覧ください。役立つと思います。


ドキュメントには、Windowsでは機能しないと記載されています。試してみましたが、シナトラは読み込まれますが、変更はリロードされません
peter

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 guardrackup毎回リロードします。


0

テンプレートを変更するだけの場合、環境を開発に設定すると、sinatraは常にテンプレートを再レンダリングします。

ruby app.rb -e development
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.