Sinatra动态配置环境

时间:2011-04-29 12:33:24

标签: ruby heroku 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

3 个答案:

答案 0 :(得分:22)

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。您可以指定所需的任何环境名称,但“生产”非常常见。如果指定了未配置的环境,则不会匹配任何配置块。 (这可能是你的错误,但这不是代码捕获的错误。)

请注意,Sinatra文档说setting RACK_ENV environment variable will be used if available。这曾经不起作用,但过去几年的某些时候已经修复了!

例如,如果您可以为服务设置环境变量,则可以控制模式。

答案 1 :(得分: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 => ['me@example.com'],
    :from => 'service@example.com',
    :subject => 'Error Occurred on Rack Application'

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

通过这种方式,Thin或Passenger或其他任何东西都可以选择,而正确的模块将在生产中加载,但您可以进行其他配置以进行开发。

答案 2 :(得分:-1)

查看Heroku文档:

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

这基本上就是我用于我的应用程序,当我在本地启动它时,它运行在4567端口。