web-dev-qa-db-ja.com

Sinatraがその場で環境を構成する

私は小さなSinatraアプリケーションの作成に成功し、すでにherokuに正常にデプロイしました。

ただし、そのアプリケーションをローカルコンピューターで開発モードで実行したいので、リモートリポジトリにプッシュしたら、herokuで本番モードにしたいです。

現在、私はこれらのオプションのいずれかを達成できます。 config.ruを次の値に変更すると:

require 'rubygems'
require 'sinatra'
require 'sinatra/reloader'
require "./calc.rb"

enable :logging
set :environment, :development
set :port, 4567

Ruby config.ruを介してローカル(ポート4567)で実行できます。 config.ruをこれに変更すると:

require 'rubygems'
require 'sinatra'
require 'sinatra/reloader'
require "./calc.rb"

enable :logging
set :environment, :production
set :port, 4567
run Sinatra::Application

Heroku(ポート80)で実行することができます。

しかし、開発と本番の両方に同じ構成を使用することはできません。

私は次のようなものが欲しいです:

Ruby config.ru devは開発用、Ruby config.ruは本番用です。

追加情報:

ローカルマシンで本番config.ruを実行しようとすると、次のようになります。

$ Ruby config.ru
(eval):2:in `method_missing': undefined method `run' for main:Object (NoMethodError)
        from (eval):4:in `__send__'
        from (eval):4:in `method_missing'
        from config.ru:10
18
leifg
C:\>type tmp.ru
require 'sinatra'
configure(:production){  p "I'm production" }
configure(:development){ p "I'mma dev mode" }
configure(:sassycustom){ p "I'mma own mode" }
exit!

C:\>rackup tmp.ru
"I'mma dev mode"

C:\>rackup -E development tmp.ru
"I'mma dev mode"

C:\>rackup -E production tmp.ru
"I'm production"

C:\>rackup -E sassycustom tmp.ru
"I'mma own mode"

C:\>rackup -E notdefined tmp.ru

環境を指定しない場合、デフォルトでdevelopmentが使用されます。 'production'は非常に一般的ですが、任意の環境名を指定できます。構成しない環境を指定した場合、一致する構成ブロックはありません。 (それはあなたの側の間違いかもしれませんが、それはコードによって捕らえられたエラーではありません。)

Sinatraのドキュメントには、 可能な場合はRACK_ENV環境変数の設定が使用されます と記載されていることに注意してください。これは以前は機能していませんでしたが、ここ数年で修正されました。

たとえば、サービスの環境変数を設定できる場合は、モードを制御できます。

22
Phrogz

Config.ruでENV['RACK_ENV']を取得し、それを使用してアプリを別の方法で構成することもできます。 Herokuではshouldデフォルトで本番環境で実行され、サーバーを起動するためにrackupすると、デフォルトで開発されます。これは、同じ構成ファイルを使用して両方の環境で実行される、私のアプリの1つからのサンプルコードです。

#\ -p 4567
require 'bundler'               # gem requires
Bundler.require(:default, ENV['RACK_ENV'].to_sym)  # only loads environment specific gems
if ENV['RACK_ENV'] == 'production'           # production config / requires
  require './lib/middleware/exceptionmailer'

  use Rack::ExceptionMailer, 
    :to => ['[email protected]'],
    :from => '[email protected]',
    :subject => 'Error Occurred on Rack Application'

else                            # development or testing only
  use Rack::ShowExceptions
end

このようにして、ThinやPassengerなどがそれを取得し、適切なモジュールが本番環境にロードされますが、開発のために他の構成を行うことができます。

6
Evan Lecklider