Muy cuidadosamente
Feature Branching es una opción, pero me parece que es algo pesada. También hace que las modificaciones profundas sean fáciles, lo que puede llevar a un bifurcación directa de su aplicación si no se mantiene bajo control. Lo ideal es que desee aumentar al máximo las personalizaciones en un intento de mantener su base de código central tan común y genérica como sea posible.
Aquí es cómo lo haría, aunque no sé si es aplicable a su base de código sin modificaciones y refacciones pesadas. Tuve un proyecto similar donde la funcionalidad básica era la misma pero cada cliente requería un conjunto de características muy específico. Creé un conjunto de módulos y contenedores que luego armé a través de la configuración (à la IoC).
luego, para cada cliente, creé un proyecto que básicamente contiene las configuraciones y el script de compilación para crear una instalación totalmente configurada para su sitio. Ocasionalmente coloco también algunos componentes hechos a medida para este cliente. Pero esto es raro y siempre que sea posible, trato de hacerlo de una forma más genérica y lo rechazo para que otros proyectos puedan usarlos.
El resultado final es que obtuve el nivel de personalización que necesitaba, que obtuve scripts de instalación personalizados, de modo que cuando llego al sitio del cliente no parezco estar ajustando el sistema todo el tiempo y, como agregado, MUY significativo. Además, puedo crear pruebas de regresión conectadas directamente a la compilación. De esta manera, en cualquier momento en que recibo un error que es específico para el cliente, puedo escribir una prueba que confirmará el sistema a medida que se implementa y, por lo tanto, puedo hacer TDD incluso a ese nivel.
en resumen:
- Sistema muy modularizado con una estructura de proyecto plana.
- Cree un proyecto para cada perfil de configuración (cliente, aunque más de uno puede compartir un perfil)
- Arme los conjuntos de funciones requeridos como un producto diferente y trátelos como tales.
Si se realiza correctamente, el ensamblaje de su producto debe contener todos menos unos pocos archivos de configuración.
Después de usar esto por un tiempo, terminé creando meta-paquetes que ensamblan los sistemas más utilizados o esenciales como una unidad central y usan este meta-paquete para los ensamblajes de los clientes. Después de unos años, terminé teniendo una gran caja de herramientas que pude ensamblar muy rápidamente para crear soluciones para los clientes. Actualmente estoy buscando en Spring Roo y veo si puedo impulsar la idea un poco más esperando que algún día pueda crear un primer borrador. del sistema justo con el cliente en nuestra primera entrevista ... Supongo que podría llamarlo User Driven Development ;-).
Espero que esto haya ayudado