lei*_*ifg 18 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
Run Code Online (Sandbox Code Playgroud)
我可以通过本地(在端口4567上)运行它ruby config.ru
.当我将config.ru更改为:
require 'rubygems'
require 'sinatra'
require 'sinatra/reloader'
require "./calc.rb"
enable :logging
set :environment, :production
set :port, 4567
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)
我能够让它在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
Run Code Online (Sandbox Code Playgroud)
Phr*_*ogz 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
Run Code Online (Sandbox Code Playgroud)
如果未指定环境,development
则默认使用.您可以指定所需的任何环境名称,但"生产"非常常见.如果指定了未配置的环境,则不会匹配任何配置块.(这可能是你的错误,但这并不是代码捕获的错误.)
请注意,Sinatra文档说如果可用,将使用设置RACK_ENV环境变量.这曾经不起作用,但在过去几年的某些时候它已被修复!
例如,如果您可以为服务设置环境变量,则可以控制模式.
小智 6
你也可以抓住ENV['RACK_ENV']
你的config.ru并使用它来配置你的应用程序不同.在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
Run Code Online (Sandbox Code Playgroud)
通过这种方式,Thin或Passenger或其他任何东西都可以获取它,并且正确的模块将在生产中加载,但您可以进行其他配置以进行开发.