tl; drカスタマイズを介して、単一のSinatraアプリを異なるサーバーで非常に異なる方法で起動させるにはどうすればよいconfig.ru
ですか?
バックグラウンド
異なるサーバーで実行されるSinatraを使用して作成された単一のWebアプリケーションがあります。現在、これらのサーバーのコードベースは、サーバーの(個別の)部分の動作方法に重要な違いがあるため、フォークされています。例えば:
- 1つのサーバーはイントラネットLDAPサーバーを介してユーザーを認証し、別のサーバーはより単純なローカルデータベーステーブルルックアップを使用します。
- 1つのサーバーは外部のcronジョブを使用して統計を定期的に更新し、別の(Windowsベースの)サーバーは内部のスリープ状態のスレッドを使用します。
- 1つのサーバーは特定のメタデータをローカルテーブルに格納し、別のサーバーは画面スクレイピング(!)を介して外部Wikiからメタデータを取得します。
…等々。
これらのコードベースを完全に共有したい(単一のGitリポジトリ)。各サーバーにはわずかに異なる構成ファイルが1つあり、アプリの起動が異なると思います。
放棄されたソリューション
環境変数に基づいてアプリの動作を変更できます。動作には少なからずバリエーションがあるので、環境変数の設定を非表示にしたくありません。
各マシンに固有の独自の「server-settings.rb」ファイルを作成し、それを自分のマシンで要求してから、app.rb
そこで構成を変更することができます。しかし、これはおそらく車輪の再発明であるように思われます。サーバーごとに名前が付けられたファイルがすでにあります。config.ru
私はこれを使うべきではありませんか?
現在のコード
私config.ru
のアプリは現在、単純に次のとおりです。
require ::File.join( ::File.dirname(__FILE__), 'app' )
run MyApp.new
そして、app.rb
それが必要とするのは、本質的に、次のとおりです。
require 'sinatra'
require_relative 'helpers/login' # customized for LDAP lookup on this server
class MyApp < Sinatra::Application
use Rack::Session::Cookie, key:'foo.bar', path:'/', secret:'ohnoes'
set :protection, except: [:path_traversal, :session_hijacking]
configure :production do
# run various code that depends on server settings, e.g.
Snapshotter.start # there is no cron on this machine, so we do it ourselves
end
configure :development do
# run various code that depends on server settings
end
end
質問
その名に恥じないようにしたいのですが、config.ru
次のようになります。
require ::File.join( ::File.dirname(__FILE__), 'app' )
run MyApp.new( auth: :ldap, snapshot:false, metadata: :remote_wiki, … )
経由で提供された設定に基づいて構成動作を変更するようにアプリケーションを変更するにはどうすればよいconfig.ru
ですか?config.ru
それとも、これは完全に間違った目的で使用しようとする虐待ですか?