私は小さな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
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環境変数の設定が使用されます と記載されていることに注意してください。これは以前は機能していませんでしたが、ここ数年で修正されました。
たとえば、サービスの環境変数を設定できる場合は、モードを制御できます。
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などがそれを取得し、適切なモジュールが本番環境にロードされますが、開発のために他の構成を行うことができます。