Подтвердить что ты не робот

Sinatra настраивает среду на лету

Я успешно написал небольшое приложение Sinatra и уже успешно развернул его на геройку.

Однако я хочу запустить это приложение в режиме разработки на моем локальном компьютере, и я хочу, чтобы он работал в режиме производства на heroku, когда я нажимаю его на удаленный репозиторий.

В настоящее время я могу выполнить любой из этих вариантов. Когда я меняю свой config.ru на следующие значения:

require 'rubygems'
require 'sinatra'
require 'sinatra/reloader'
require "./calc.rb"

enable :logging
set :environment, :development
set :port, 4567

Я могу запустить его локально (по порту 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

Я могу заставить его работать на 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
4b9b3361

Ответ 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 указано, что параметр среды RACK_ENV будет использоваться, если он доступен. Раньше это не работало, но некоторое время за последние несколько лет было исправлено!

Если, например, вы можете установить переменную среды для своей службы, вы можете управлять этим режимом.

Ответ 2

Вы также можете захватить 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 => ['[email protected]'],
    :from => '[email protected]',
    :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.