¿Cuándo debería dividirse un proyecto de varios módulos en árboles de repositorio separados?

StackOverflow https://stackoverflow.com/questions/14397

  •  08-06-2019
  •  | 
  •  

Pregunta

Actualmente tenemos un proyecto con un diseño de repositorio de subversión estándar de:

./trompa
./sucursales
./etiquetas

Sin embargo, a medida que avanzamos en el camino de OSGi y un proyecto modular, terminamos con:

./trunk/paquete/principal
./trunk/paquete/modulea
./trunk/bundle/moduleb ./tags/bundle/main-1.0.0
./tags/bundle/main-1.0.1
./tags/bundle/modulea-1.0.0

La 'compilación' sigue siendo bastante monolítica en el sentido de que construye todos los módulos en secuencia, aunque estoy empezando a preguntarme si deberíamos refactorizar la compilación/repositorio a algo más parecido a:

./paquete/principal/troncal
./bundle/main/tags/main-1.0.0
./bundle/main/tags/main-1.0.1
./bundle/modulea/trunk
./bundle/modulea/tags/modulea-1.0.0

En este patrón, me imaginaría que cada módulo se construye a sí mismo y almacena su binario en un repositorio (maven, ivy u otra ruta del propio repositorio de subversion).

¿Existen pautas o "mejores prácticas" sobre los diseños de proyectos una vez que uno se vuelve modular?

¿Fue útil?

Solución

El libro Subversion contiene dos secciones sobre esto:

Una entrada de blog sobre el tema: "Diseño del repositorio de Subversion"

Sin embargo, la respuesta corta:Si bien su kilometraje variará (cada situación es individual), su /bundle/<project>/(trunk|tags|branches) El esquema es bastante común y probablemente funcionará bien para usted.

Otros consejos

Esto depende en gran medida de las preferencias personales, pero considero que la siguiente estructura es adecuada para proyectos grandes que constan de muchos módulos:

branches
  project-name
    module1
      branch-name
    module2   
      possibly-another-branch-name
    branch-name-on-a-higher-level-including-both-modules
      module1
      module2
tags
  ... (same as branches)
trunk
  project-name
    module1
    module2

También he usado a menudo la estructura en repositorios grandes que contienen muchos proyectos, porque mantener todos los proyectos en el mismo repositorio hace que sea más fácil hacer referencias cruzadas de proyectos y compartir código entre ellos (con historial).

Me gusta usar la estructura con carpetas de tronco raíz, etiquetas y ramas desde el principio porque, según mi experiencia (con repositorios grandes que contienen muchos proyectos), muchos subproyectos y módulos nunca tendrán etiquetas o ramas separadas, por lo que no es necesario cree la estructura de carpetas para ellos.También facilita que los desarrolladores revisen todo el tronco del repositorio y no obtengan todas las etiquetas y ramas (que no necesitan la mayor parte del tiempo).

Sin embargo, supongo que esto es una cuestión de proyecto o política de la empresa.Si tiene un repositorio para cada proyecto o es probable que un desarrollador determinado solo trabaje en un único proyecto en el repositorio a la vez, es posible que el tronco rooteado no tenga tanto sentido.

Sólo mis dos centavos...

Sólo quiero enfatizar el comentario en la documentación de SVN (ya citado en otra respuesta, mismo hilo) http://svnbook.red-bean.com/en/1.4/svn.reposadmin.planning.html#svn.reposadmin.projects.chooselayout

El extracto hace referencia a la siguiente estructura:/ Trunk/ Calc/ Calendar/ Spreadsheet/ ... etiquetas/ calc/ calendario/ hoja de cálculo/ ... ramas/ calc/ calendario/ hoja de cálculo/

"No hay nada particularmente incorrecto en un diseño de este tipo, pero puede parecer intuitivo o no para los usuarios.Especialmente en situaciones grandes, de proyectos múltiples con muchos usuarios, esos usuarios pueden tender a estar familiarizados con sólo uno o dos de los proyectos en el repositorio.Pero los proyectos-como-ramas-hermanos tienden a restar importancia a la individualidad del proyecto y centrarse en el conjunto completo de proyectos como una sola entidad.Pero ese es un problema social.Nos gusta nuestra disposición sugerida originalmente por razones puramente prácticas: es más fácil preguntar (o modificar, o migrar a otro lugar) la historia completa de un solo proyecto cuando hay una única ruta de repositorio que contiene toda la historia: pasada, presente, etiquetada y ramificado, para ese proyecto y sólo para ese proyecto".

Por mi parte, tiendo a estar bastante de acuerdo con esto y prefiero el siguiente diseño:/ utils/ calc/ trunk/ tags/ ramas/ calendar/ trunk/ tags/ ramas/ ... oficina/ hoja de cálculo/ trunk/ tags/ ramas/

La razón es simplemente que no es práctico etiquetar un conjunto de proyectos completo cuando se desea etiquetar solo un subconjunto específico.

Usemos un ejemplo:Si el proyecto 1 depende del módulo A v1.1 y del módulo B v2.3, no quiero que aparezca el módulo A v2.x más nuevo en las etiquetas.De hecho, al regresar algunos días/semanas/meses después a esta versión etiquetada, me vería obligado a abrir el descriptor del paquete en la versión etiquetada del proyecto-1 para leer la versión del móduloA realmente requerida.

Además, si tengo que hacer una copia de seguridad específica de las fuentes de esta versión en un CD, sólo quiero exportar esta etiqueta sin descargar cientos de megabytes de material no relacionado.

Fueron sólo mis dos centavos.

Respondí una pregunta similar en StackOverflow Pregunta sobre la estructura de control de versiones.De hecho, encaja aún mejor aquí, ya que realizamos un gran desarrollo OSGi y tenemos muchos paquetes.Debo hacerme eco de los comentarios de Anders Sandvig:mantenga tronco/etiquetas/ramas en el nivel raíz ya que solo ramificará un conjunto limitado de módulos.Tampoco interfiere con la construcción de módulos individualmente.

No copiaré la respuesta que di antes, pero es totalmente relevante para esta pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top