Синатра настраивает среду на лету - PullRequest
18 голосов
/ 29 апреля 2011

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

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

Дополнительная информация:

Когда я пытаюсь запустить производственный 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

Ответы [ 3 ]

22 голосов
/ 29 апреля 2011
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. Вы можете указать любое имя среды, которое хотите, хотя «production» встречается очень часто. Если вы указываете среду, которую вы не настраиваете, ни один блок конфигурации не будет соответствовать. (Это может быть ошибка с вашей стороны, но это не ошибка, обнаруженная кодом.)

Обратите внимание, что в документации Sinatra сказано, что установка переменной среды RACK_ENV будет использоваться, если она доступна . Раньше это не работало, но какое-то время в последние несколько лет это было исправлено!

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

5 голосов
/ 14 мая 2011

Вы также можете получить 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

Таким образом, Thin или Passenger или любой другой, который его заберет, и нужные модули будут загружены в производствоно вы можете сделать другую конфигурацию для разработки.

0 голосов
/ 29 апреля 2011

Посмотрите документацию Heroku:

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

Это в основном то, что я использую для своего приложения, когда я запускаю его локально, оно работает на порту 4567.

...