Me gustaría saber si tiene sentido dividir el proyecto en el que estoy trabajando en dos repositorios en lugar de uno.
Por lo que puedo decir:
- Frontend se escribirá en html + js
- Backend en .net
- El backend no depende del frontend y el frontend no depende del backend
- El frontend utilizará una API de descanso implementada en el backend.
- El frontend podría estar alojado en cualquier servidor http estático.
A partir de ahora, el repositorio tiene esta estructura:
raíz:
- Interfaz/*
- backend / *
Creo que es un error mantener ambos proyectos en el mismo repositorio. Dado que ambos proyectos no tienen dependencias entre sí, deben pertenecer a repositorios individuales y, si es necesario, a un repositorio principal que tenga submódulos.
Me han dicho que no tiene sentido y que no obtendremos ningún beneficio al hacerlo.
Estos son algunos de mis argumentos:
- Tenemos dos módulos que no dependen entre sí.
- Tener el historial de origen de ambos proyectos a largo plazo puede complicar las cosas (intente buscar en el historial algo en la interfaz mientras tiene la mitad de las confirmaciones que no están relacionadas con el error que está buscando)
- Conflicto y fusión (Esto no debería suceder, pero tener a alguien empujando al backend obligará a otro desarrollador a hacer cambios en el backend para impulsar los cambios frontend).
- Un desarrollador puede trabajar solo en el backend, pero siempre tendrá que tirar de la interfaz o al revés.
- A la larga, cuándo será el momento de la implementación. De alguna manera, la interfaz podría implementarse en múltiples servidores estáticos mientras se tiene un servidor de fondo. En todos los casos, las personas se verán obligadas a clonar todo el backend con él o a crear un script personalizado para enviar a todos los servidores solo el front-end o eliminar el back-end. Es más fácil empujar / jalar solo el frontend o backend que ambos si solo se necesita uno
- Contraargumento (una persona puede trabajar en ambos proyectos), cree un tercer repositorio con submódulo y desarrolle con él. El historial se mantiene separado en módulos individuales y siempre se pueden crear etiquetas donde la versión de backend / frontend realmente funciona en sincronía. Tener ambos frontend / backend juntos en un repositorio no significa que trabajarán juntos. Es solo fusionar la historia en un gran repositorio.
- Tener frontend / backend como submódulos facilitará las cosas si desea agregar un profesional independiente al proyecto. En algunos casos, realmente no desea dar acceso completo a la base de código. Tener un gran módulo hará las cosas más difíciles si desea restringir lo que los "extraños" pueden ver / editar.
- Introducción y corrección de errores, inserté un nuevo error en la interfaz. Entonces alguien arregla un error en el backend Con un repositorio, retroceder antes del nuevo error también revertirá el backend, lo que podría dificultar la reparación. Tendría que clonar el backend en una carpeta diferente para que el backend funcione mientras se soluciona el error en la interfaz ... luego tratar de reactivar las cosas ... Tener dos repositorios será sencillo porque mover el HEAD de un repositorio ganó No cambies el otro. Y probar contra diferentes versiones de backend será indoloro.
¿Puede alguien darme más argumentos para convencerlos o al menos decirme por qué no tiene sentido (más complicado) dividir el proyecto en dos submódulos? El proyecto es nuevo y la base de código tiene un par de días de antigüedad, por lo que no es demasiado pronto para solucionarlo.
fuente
Algunos de sus argumentos son válidos y otros no.
Eso en realidad no es del todo cierto. Para poder comunicarse, tanto el front-end como el back-end deben tener una interfaz común (descripción). Eso lo convierte en un argumento débil a favor de tener ambos en un repositorio común. Pero solo un argumento débil, ya que no hace mucha diferencia.
Este es un argumento falso. Si desea consultar cómo se solucionó un error en particular, busque en el rastreador de errores para el cual commit contiene la corrección. Y si desea saber cómo evolucionó un código en particular, mire el historial de un solo archivo (o como mucho un puñado). En cualquier caso, tener otros archivos, posiblemente de otros módulos, en el repositorio no debería complicar las cosas de ninguna manera.
Este es un argumento falso. No conozco ningún VCS (medio decente) en el que necesite sincronizar todo el repositorio antes de poder confirmar / enviar sus cambios. Como máximo, debe sincronizar las carpetas que contienen los archivos modificados (y a menudo solo los archivos mismos).
Este es el mismo argumento falso que el anterior.
Dependiendo de cómo las personas imaginen que se realizará el despliegue, esto puede ser un argumento válido. Si la implementación se realizará desempacando un archivo zip / tarbal en el servidor, no importa cómo estén organizados sus repositorios. Si la implementación se realizará al retirar (parte de) un repositorio en el servidor, entonces puede ser una buena idea usar repositorios separados para los módulos que se implementan por separado.
Este es un argumento válido, pero no es tan fuerte.
Este es un argumento válido.
Es un argumento falso, porque significaría que después de dos correcciones de errores en un módulo, no podrá revertir el primero. Cualquier VCS medio decente le permitirá revertir casi cualquier confirmación anterior (aunque a menudo significará que realiza una nueva confirmación que revierte esos cambios, a veces incluso para la parte superior de HEAD).
Este es realmente un buen argumento. Tener dos repositorios hace que sea más fácil probar los escenarios en los que los front-end y back-end desplegados pueden estar (ligeramente) fuera de sincronización.
fuente
Esta publicación es un poco antigua pero me gustaría contribuir. Si bien su back-end no sabe realmente sobre el front-end, el front-end necesita tener solicitudes que coincidan con la API del back-end. Si considera su back-end como una API REST, podría definir un archivo de interfaz como una interfaz YAML swagger. Ahora hay realmente 3 proyectos, que puede dividir individualmente en diferentes repositorios como mejor le parezca:
La definición de API es una dependencia en los otros dos proyectos, digamos que estaba usando Maven como una herramienta de inyección de dependencia. Entonces depende de cuán estrictamente desee hacer el control de versiones. Puede aumentar la versión del proyecto de definición de API cada vez que realice un cambio para asegurarse de que los proyectos estén siempre en un estado compatible pero requiera más sobrecarga, o puede usar algo como INSTANTÁNEAS en maven, y solo realice el control de versiones una vez que están contentos con la interfaz que es menos costosa pero a menudo puede tener incompatibilidades. Pero siempre que aplique la definición de API en su front-end y back-end, estará bien dividiendo los proyectos en diferentes repositorios.
Estos problemas tienen más que ver con la gestión de dependencias. Incluso si los proyectos no están divididos y están en el mismo repositorio, es bastante fácil que el sitio web se coloque en un estado en el que el front-end y el back-end no estén sincronizados. Realmente, la única forma de detener esto es definir realmente el contrato entre los dos, pero desea hacerlo de una manera que no acople las implementaciones del front-end y el back-end, al igual que codificaría una interfaz en su lugar de una implementación en programación OO.
Además, para manejar de manera preventiva la crítica de que esto crea una sobrecarga de mantener este archivo de interfaz, swagger, por ejemplo, incluso puede producir códigos auxiliares para diferentes lenguajes de programación y marcos como JAX-RS. Para que pueda producir una interfaz en la tecnología elegida y luego implementar esta interfaz. También agrega documentación muy agradable a su back-end, lo que facilita a los desarrolladores front-end hacer su trabajo.
fuente