ruby - español - heroku panel
Sinatra configurando entornos sobre la marcha. (3)
Mira la documentación de 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.
He escrito con éxito una pequeña aplicación de Sinatra y ya la he implementado con éxito en heroku.
Sin embargo, quiero ejecutar esa aplicación en modo de desarrollo en mi computadora local y quiero tenerla en modo de producción en heroku una vez que la coloque en el 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
Puedo ejecutarlo localmente (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
Puedo hacerlo funcionar en Heroku (en el puerto 80).
Pero no puedo usar la misma configuración tanto para el desarrollo como para la producción.
Me gustaría tener algo como:
ruby config.ru dev
para desarrollo y ruby config.ru
para producción.
Información Adicional:
Cuando intento ejecutar el archivo config.ru en mi máquina local, obtengo:
$ 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
También puede tomar ENV[''RACK_ENV'']
en su config.ru y usar esa configuración de su aplicación de manera diferente. En Heroku debería ejecutarse en producción de forma predeterminada y, si se rackup
para iniciar su servidor, se desarrollará de forma predeterminada. Aquí hay algunos ejemplos de código de una de mis aplicaciones que se ejecuta en ambos 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, Thin o Passenger o lo que sea, lo recogerán y los módulos correctos se cargarán en producción, pero puede hacer otra configuración para el desarrollo.
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
Si no especifica un entorno, el development
se utiliza 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á. (Puede que sea 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 la configuración de la variable de entorno RACK_ENV se utilizará si está disponible . Esto solía no funcionar, pero en algún momento de los últimos años se ha solucionado.
Si, por ejemplo, puede establecer una variable de entorno para su servicio, puede controlar el modo.