Estoy tratando de reunir formas efectivas para que otros hayan resuelto el siguiente problema. En el trabajo, nos hemos visto obligados a lanzar un parche de software (que se instalará en los sistemas de usuario final) que solo queremos que sea visible para un cliente específico. El código personalizado está en su propia rama de control de fuente. El problema es que tenemos dos líneas de código paralelas (y scripts de compilación) para mantener sincronizadas, y cada vez que revisamos el código original tenemos que revisar y probar el código específico del cliente.
Tengo curiosidad, ¿cómo manejan otras organizaciones este escenario? Estamos abiertos a soluciones comerciales y no solo técnicas (relacionadas con el control de origen). Por ejemplo, hemos hablado acerca de decirle al cliente que no pueden recibir actualizaciones en esa sucursal.
Nuestra estrategia de ramificación es así (basada en la Guía de ramificación de Visual Studio TFS , aunque estamos usando Subversion para ello)
hg
ogit
podría sugerirle que mire el uso de Patch Queues ( Mercurial Queues Extension o Stacked Git ) pero no sé si TFS tiene algo similar.svn
lo que significa que no saturan su flujo de trabajo normal. Si parece que las colas de parche podrían ser útiles, puede probarlas usando git-svn o hgsubversion . El uso de una interfaz DVCS para suavizar un flujo de trabajo complicadosvn
podría incluso alentar a las personas a considerar la posibilidad de cambiar a un DVCS al por mayor, para obtener todos los demás beneficios.Respuestas:
Cuando comienza a entregar parches específicos para el cliente, ha creado inmediatamente una nueva versión de su producto que debe mantenerse junto a él. Eso significa que los cambios deben propagarse entre las dos versiones. Por lo general, los parches específicos del cliente son personalizaciones que deben ser propiedad del cliente, incluido el código fuente.
Parece poco probable que un parche para arreglar algo no llegue a la rama principal a menos que sea una solución temporal menos que óptima para un problema inmediato. Si ese es el caso, entonces el parche solo tendrá que mantenerse hasta que la solución esperada llegue a la línea principal.
fuente
Me parece que la clave es "visible": ¿qué hay de no tener una rama de código separada, sino una opción de configuración que cambia el comportamiento?
fuente
¿Ves esto como algo a corto o largo plazo? El hecho es que el negocio ya ha decidido acomodar a este cliente a tan corto plazo que ya ES una decisión comercial que debe resolverse principalmente mediante prácticas comerciales (aceptar el costo adicional / cobrarle al cliente el costo).
Si es a largo plazo, probablemente verá ahorros si vuelve a factorizar el software para acomodar fácilmente las necesidades de los clientes a través de la configuración (o configuración, etc.).
Si es relativamente a corto plazo, significa que pronto fusionará esos cambios nuevamente en la rama principal / desarrollo y todos los usuarios también verán los cambios, entonces probablemente sea aceptable trabajar dentro de las limitaciones de su situación actual. Como dije, la decisión de qué hacer debería haberse tomado cuando se tomó la decisión de acomodar al cliente.
Larga historia corta. Arreglo técnico a largo plazo, trato a corto plazo.
Por supuesto, hay un punto donde es un lanzamiento de moneda. Si estás en ese punto, entonces haría lo que prefieran los desarrolladores.
fuente
También usamos subversión, y nos encontramos con tal escenario exacto.
Aquí hay algunos puntos clave para recordar:
Si bien es necesario uno debe evitar sucursales específicas para los clientes, la necesidad debe ser minimizada lo más posible; siempre pregunte si es posible generalizar la solución que podría funcionar para todos.
Las sucursales específicas del cliente deben originarse en una nueva versión. Supongamos que tiene una versión 1.2 y que ha derivado de la versión 1.2.1 hasta 1.2.11: las sucursales del cliente deben tener permitidos todos los parches, por lo tanto, la sucursal del cliente debe seguir siendo compatible con respecto a la versión principal.
La sucursal específica del cliente debe crearse de nuevo cuando comience una nueva versión no compatible. La parte desafortunada es que de alguna manera puede requerir volver a hacer el trabajo. Una solución puede ser crear todos los parches de las sucursales de los clientes que se deben extraer y todo lo que sea compatible puede aplicarse a la nueva sucursal del cliente.
Siempre, bajo ninguna circunstancia, debe retrasar los cambios específicos del cliente para liberar la rama o la troncal. Sin embargo, idealmente uno debería tratar de generalizar el trabajo de tal manera que dicho trabajo específico del cliente se mantenga reducido.
He intentado juntar esta idea para mostrarla :
fuente
¿Qué tal introducir un mecanismo de extensión en su código?
Tu código principal tiene:
Cuando se inicia el programa, busca DLL / equivalente moral, en su carpeta de inicio para las personalizaciones locales. Si encuentra uno, se carga y puede contener una versión específica de la compañía de Foo
FooForABC implementa el mismo comportamiento que Foo, pero anula las funciones según sea necesario para proporcionar el comportamiento específico que ABC necesita. La técnica debe ser lo suficientemente flexible como para manejar cualquier escenario que necesite soportar.
fuente