【问题标题】:Sinatra configuring environments on the flySinatra 动态配置环境
【发布时间】:2011-08-15 11:31:54
【问题描述】:

我已经成功编写了一个小 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

【问题讨论】:

    标签: ruby heroku sinatra


    【解决方案1】:
    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。这曾经不起作用,但在过去几年的某个时候,它已经修复了!

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

    【讨论】:

    • RACK_ENV 不仅仅是 windows,我的 mac 上也发生了同样的事情。有趣的是,去年的机架中似乎有一个fix for it,但它并没有成为宝石。 Rack 确实将 RACK_ENV 设置为您使用 -E 指定的任何内容,并且默认为“开发”,sinatra 应该会看到。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      查看 Heroku 文档:

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

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

      【讨论】:

      • 我的本地机器上还需要其他什么吗,因为我无法在 config.ru 中运行 Sinatra::Application 行(抛出上述错误)
      猜你喜欢
      • 2014-05-24
      • 2018-10-25
      • 1970-01-01
      • 2016-05-24
      • 2019-12-04
      • 2021-01-26
      • 2011-11-05
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多