2011-04-29 12 views
17

He escrito con éxito una pequeña aplicación de Sinatra y ya la implementé con éxito en heroku.Entornos de configuración de Sinatra sobre la marcha

Sin embargo, quiero ejecutar esa aplicación en modo de desarrollo en mi computadora local y quiero tener su modo de producción en heroku una vez que lo empuje al repositorio remoto.

Actualmente puedo lograr cualquiera de estas opciones. Cuando cambio mi config.ru a los siguientes valores:

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

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

soy capaz de ejecutar de forma local (en el puerto 4567) a través de ruby config.ru. Cuando cambio el config.ru a esto:

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

enable :logging 
set :environment, :production 
set :port, 4567 
run Sinatra::Application 

soy capaz de conseguir que se ejecute en Heroku (en el puerto 80).

Pero no puedo usar la misma configuración para el desarrollo y la producción.

me gustaría tener algo como:

ruby config.ru dev para el desarrollo y para la producción de ruby config.ru.

Información adicional:

Cuando trato de ejecutar el config.ru producción en mi máquina local me sale:

$ 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 

Respuesta

20

Si no especifica un entorno, development se usa de forma predeterminada. Puede especificar cualquier nombre de entorno que desee, aunque 'producción' es muy común. Si especifica un entorno que no configura, ningún bloque de configuración coincidirá. (Podría ser un error de su parte, pero no es un error detectado por el código.)

Tenga en cuenta que la documentación de Sinatra dice que setting RACK_ENV environment variable will be used if available. Esto solía no funcionar, ¡pero en algún momento en los últimos años se ha solucionado!

Si, por ejemplo, puede establecer una variable de entorno para su servicio, puede controlar el modo.

+2

El RACK_ENV no es solo windows, pasa lo mismo para mí en mi mac. Curiosamente, parece haber un [arreglo] (https://github.com/rack/rack/commit/32de46c139e10dc2261ca63a3049e98e310d0781) en rack del año pasado, pero no ha llegado a la gema. Rack ajusta RACK_ENV a lo que especifique con ''E' y se predetermina a 'desarrollo' y sinatra debería ver eso. – matt

-1

vistazo a la documentación Heroku:

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

Eso es básicamente lo que uso para mi aplicación, cuando la inicio localmente se ejecuta en el puerto 4567.

+0

Necesito algo más en mi máquina local, porque no puedo ejecutar la línea Sinatra :: Aplicación en config.ru (se emite el error mencionado anteriormente) – leifg

5

También puede tomar ENV['RACK_ENV'] en su config.ru y usar eso configura su aplicación de manera diferente. En Heroku es si se ejecuta en producción por defecto y si rackup para iniciar su servidor será el desarrollo por defecto. He aquí algunos ejemplos de código de una de mis aplicaciones que se ejecuta tanto en entornos con el mismo archivo de configuración:

#\ -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 

De esta manera, delgada o de pasajeros o lo que sea va a recogerla y los módulos adecuados conseguirá cargado en la producción, sino que puede hacer otra configuración para el desarrollo.

Cuestiones relacionadas