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 for development和ruby config.ru for production。

附加信息:

当我尝试在我的本地机器上运行生产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 。 您可以指定所需的任何环境名称,但“生产”非常常见。 如果指定未配置的环境,则不会匹配任何配置块。 (这可能是您的错误,但这不是代码捕获的错误。)

请注意,Sinatra文档说如果可用,将使用设置RACK_ENV环境变量 。 这曾经不起作用,但在过去几年的一些时间它已经修复!

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

你也可以在你的config.ru中获取ENV['RACK_ENV']并使用它来配置你的应用程序。 在Heroku上,默认情况下它应该在生产中运行,如果你启动服务器,它将默认开发。 以下是我的一个应用程序中的一些示例代码,这些代码在具有相同配置文件的两个环境中运行:

 #\ -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或其他任何东西都可以选择它,并且正确的模块将在生产中加载,但您可以进行其他配置以进行开发。

看看Heroku文档:

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

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