Tenemos algunas bibliotecas comunes (C# pero supongo que esto no es específico de plataforma o de idioma), llamémoslos A, B y C. La biblioteca A tiene referencias a B y C, la biblioteca B tiene una referencia a una DLL de terceros, y la biblioteca C es independiente. La idea detrás de tres proyectos separados era que cada biblioteca tenía una funcionalidad distinta, pero con el tiempo la biblioteca A se ha convertido en una biblioteca común más o menos "atrapante" a la que hace referencia la mayoría de las aplicaciones de los clientes. Solo algunas aplicaciones hacen referencia a B y/o C sin A también.¿Por qué no debería tener una sola biblioteca de utilidad monolítica?
Estamos tratando de mejorar nuestras convenciones de control de código fuente, y una cosa que intentamos hacer es etiquetar y liberar adecuadamente estas DLL de biblioteca, para que los archivos de proyecto del cliente puedan apuntar a una versión estática del código en lugar del -cambiando el baúl. Esto está resultando un poco intrincado, por ejemplo, un proyecto de cliente que hace referencia tanto a A como a B. A sí hace referencia a B, por lo que técnicamente hay dos referencias a B provenientes del proyecto de cliente.
Así que lo más obvio parece ser combinar todo en una única biblioteca común/utilidad con espacios de nombres bien organizados. Como dije, casi todas las aplicaciones de clientes hacen referencia a una de estas bibliotecas, entonces, ¿a quién le importa? Hacer esto no introducirá ninguna situación indeseable con dependencias de terceros, y todas nuestras máquinas de destino son internas y mantienen aproximadamente la misma configuración de entorno/software.
Esto parece una solución muy fácil, así que pensé que al menos tendría una segunda opinión. Una alternativa podría ser usar el GAC y firmar/versionar fuertemente todo. ¿Me falta algo de captura aquí?
Depende de la plataforma. NodeJS usa la componente como una ventaja. Al mantener árboles de dependencia para cada módulo de forma independiente, cada módulo puede usar cualquier versión de una biblioteca para la que fue diseñado originalmente. Al ignorar por completo el problema de la consolidación, el "infierno de la dependencia" se convierte en un problema. A medida que se agrega una nueva funcionalidad, solo se deben actualizar los dependientes que requieren la nueva funcionalidad. –
¿Cuál crees que es más caro, el espacio en disco requerido para almacenar más copias de una biblioteca? ¿O el tiempo de desarrollo que lleva actualizar todos los dependientes de una biblioteca cada vez que se introduce un cambio incompatible con versiones anteriores? ¿Qué pasa con el riesgo de perder un código que rompe una actualización y se empuja a la producción? Una menor funcionalidad significa que el código tendrá que volver a compilarse con menos frecuencia, alcanzará un estado estable antes, y será trivial reemplazarlo. En cierto modo, da vuelta a la convención, pero el énfasis en la componenteción funciona sorprendentemente bien en la práctica. –
No hay nada malo con la componente, la pregunta era por qué criterio. – Alex