Aquí están nuestros requisitos básicos:Ejecutar una versión personalizada de una aplicación Rails
- Tenemos una aplicación de base de rieles, que está siendo mantenido activamente.
- Queremos ofrecer una versión personalizada de esta aplicación, dado que:
- Los servidores deben residir en la premisa de nuestros clientes y funcionar en un dominio diferente.
- hay una instrumentación de registro específica para su propio monitoreo en el centro de datos.
Para hacer eso, puedo ver varias opciones para alcanzar ese objetivo:
- rama Git
Rails::Engine
Rails::Application
La respuesta más obvia sería ser la sucursal de Git, para una total flexibilidad.
Sin embargo, no estoy seguro de si es una buena idea, ya que la base de código se comparte en gran medida y la línea principal tiene muchas más actividades. Ponerse al día con rebase/merge podría ser una molestia adicional.
Queremos desacoplar las versiones original y personalizada en la medida de lo posible. En otras palabras, queremos tener menos conflictos lo más posible entre el original y el personalizado.
Rails::Engine
o Rails::Application
parecía una idea estrecha (no estoy familiarizado con los carriles de Motores), pero yo no entiendo cómo tener OurApp::Application
y OurCustomizedApp::Application
en un lugar y cambiar entre ellos a nivel mundial y de forma dinámica.
Probablemente sería bueno tener:
- personalizados inicializadores, controladores y puntos de vista en un directorio independiente para anular (o parche) el original capacidad
- para especificar qué aplicación (el original o la personalizada) para arrancar mediante una variable de entorno como
RAILS_APP
- ficheros de configuración independientes, así:
config/database.yml
serconfig/customer1/database.yml
- capacidad de utilizar la misma
deploy.rb
de Capistrano (p robably conconfig/servers.yml
yconfig/customer1/servers.yml
a definir las funciones y los PI?)
¿Hay prácticas/convenciones para nuestras necesidades? ¿Algún consejo?
Nuestras aplicaciones se ejecutan en Ruby 1.9.2 + Rails 3.0.3.
ACTUALIZACIÓN
Empezamos como una rama Git. Creamos una tarea de rake para generar un archivo en config/branch
que incluye texto como "maestro" o "personalizado", y application.rb lo lee en bootstrap.Las configuraciones como database.yml
o servers.yml
ahora viven en config/mainline/
o config/customized/
, y application.rb las maneja en consecuencia.
config.paths.config.database = "config/#{branch}/database.yml"
No es perfecto, pero es lo suficientemente bueno por ahora. Actualizaré cuando encontremos una mejor manera de hacer esto.
Hemos terminado con la sucursal de Git y ha estado funcionando bastante bien hasta el momento. ¡Gracias! – kenn