2011-04-29 104 views
17

我已經成功地寫了一點Sinatra應用程序,並已成功部署在heroku上。Sinatra動態配置環境

但是我希望在本地計算機上以開發模式運行該應用程序,並且我希望在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 

回答

20

如果您未指定環境,則默認使用development。你可以指定你想要的任何環境名稱,但'生產'是非常普遍的。如果您指定一個未配置的環境,則不會匹配配置塊。 (這可能是您的錯誤,但它不是代碼捕獲的錯誤。)

請注意,Sinatra文檔說明了setting RACK_ENV environment variable will be used if available。這曾經不起作用,但在過去的幾年裏它已經修復了一段時間!

例如,如果您可以爲您的服務設置環境變量,則可以控制該模式。

+2

RACK_ENV的東西不僅僅是windows,同樣的情況也會發生爲我在我的Mac。有趣的是,去年似乎有一個[修復](https://github.com/rack/rack/commit/32de46c139e10dc2261ca63a3049e98e310d0781)機架,但它並沒有成爲寶石。 Rack確實將RACK_ENV設置爲你使用'-E'指定的值,默認爲'開發',sinatra應該看到。 – matt 2011-04-29 17:04:37

-1

看看Heroku的文檔:

http://devcenter.heroku.com/articles/rack#frameworks

這基本上是我用於我的應用程序,當我在本地啓動它時,它在端口4567上運行。

+0

我是否需要我的本地機器上的其他東西,因爲我不能在config.ru中運行Sinatra :: Application應用程序(上面提到的錯誤會引發) – leifg 2011-05-01 13:30:02

5

你也可以在你的config.ru中抓取ENV['RACK_ENV']並使用它來配置你的應用程序。在Heroku上,應該默認運行,如果rackup啓動你的服務器,它將默認開發。下面是從我的應用程序之一,在使用相同的配置文件兩種環境中運行一些示例代碼:

#\ -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 

這樣,薄或乘客或任何將它撿起來,正確的模塊將在生產,但你得到加載可以做其他配置進行開發。