2011-04-29 97 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 

这样,薄或乘客或任何将它捡起来,正确的模块将在生产,但你得到加载可以做其他配置进行开发。