Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Sinatra动态配置环境_Ruby_Heroku_Sinatra - Fatal编程技术网

Ruby Sinatra动态配置环境

Ruby Sinatra动态配置环境,ruby,heroku,sinatra,Ruby,Heroku,Sinatra,我已经成功地编写了一个小Sinatra应用程序,并已成功地将其部署到heroku上 但是,我希望在本地计算机上以开发模式运行该应用程序,并且在将其推送到远程存储库后,在heroku上以生产模式运行该应用程序 目前,我可以实现这些选项中的任何一个。当我将config.ru更改为以下值时: require 'rubygems' require 'sinatra' require 'sinatra/reloader' require "./calc.rb" enable :logging set :

我已经成功地编写了一个小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
用于生产

其他信息:

当我尝试在本地计算机上运行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

请参阅Heroku文档:

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

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
如果未指定环境,则默认情况下使用
开发
。您可以指定任何想要的环境名称,尽管“production”非常常见。如果指定了未配置的环境,则没有配置块匹配。(这可能是您的错误,但不是代码捕获的错误。)

请注意,Sinatra的文档说明了这一点。这过去不起作用,但在过去几年的某个时候它已经被修复了


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

您还可以在config.ru中获取
ENV['RACK\u 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或其他任何人都可以选择它,并在生产中加载正确的模块,但您可以为开发进行其他配置。

RACK_ENV不仅仅是windows,我在mac上的情况也是如此。有趣的是,从去年开始似乎有了一个新的发展,但它还没有进入创业板市场。Rack会将Rack_ENV设置为您用
-E
指定的任何值,并默认为“development”,sinatra应该会看到。我在本地计算机上还需要什么吗,因为我无法让行在config.ru中运行sinatra::Application(引发上述错误)