2011-01-24 15 views
5

Tengo un proyecto maestro que utiliza un enfoque de árbol de fuentes bastante estándar + supertiposidades mercuriales.Superpositorios mercuriales: administración de jerarquías de dependencia más complejas

Master 
\lib - compiled binaries - things like log4net, AutoFac, etc 
\source - VS solution, one folder per project, etc 
\tools - stuff used during the build process 

\source\contrib - contains any subrepos like so: 

\source\contrib\Sub1 
\source\contrib\Sub2 

Master\.hgsub contains something like 
source\contrib\Sub1 = https://myserver.com/Sub1 

Ahora, se determinó recientemente que Sub2 necesita un poco de código de Sub 1, y por lo tanto tengo que ajustar para esta nueva estructura de dependencias.

El problema, por supuesto, es que si sigo el mismo enfoque que el anterior y agrego Sub1 como un subrepos de Sub2, termino con esta situación fea.

\source\contrib\Sub2\source\contrib\Sub1 

¡Master ahora tiene 2 copias independientes de Sub1!

Así que sé que debería estar usando rutas relativas al hacer referencia a los subrepos (el RHS de =), pero eso no ayudará a mi escenario aquí, tal como lo entiendo. No creo que haya ninguna forma de hacer que el LHS viva fuera del del repositorio Maestro, lo que I piensa que es lo que realmente necesito aquí.

Tengo un par de ideas sobre cómo solucionar esto, pero ninguna me sienta bien, y supongo que tiene que haber una manera mejor. Mi solución ideal me permite compartir el mismo sub-repo entre múltiples proyectos sin pagar la penalidad de tener varias copias. Eso sólo parece derrochador e ineficiente en mi escenario aquí (además, me gustaría tener todos los proyectos que tienen una dependencia en Sub1 utilizar la misma revisión de Hg, en lugar de ser independiente Revisioned)

  1. Retire Sub1 como un subrepos de Master, y cambiar las rutas relativas en la solución Master para hacer referencia al Sub1 doblemente anidado. Esta estructura de ruta no solo es horrible, pero si agrego un Sub3 al máster que tiene una dependencia en Sub1, aún tengo 2 copias de Sub1.

  2. Compile una copia de Sub1 y simplemente colóquela en el directorio \ lib. Sub1 todavía está experimentando una rotación, y prefiero compilar contra las versiones fuente. No quiero pagar el impuesto de copiar constantemente en binarios nuevos al árbol fuente todo el tiempo (y abotagar el árbol).

  3. De alguna manera rompa la dependencia de Sub2 en Sub1. Según la arquitectura de los repositorios, esto probablemente no va a suceder. Sub1 contiene un código de biblioteca compartida de propósito muy general. Sub2 contiene el contrato de servicio WCF/interfaz/tipos que se necesita en dos proyectos muy separados: un SDK de cliente y la implementación del servidor. En este momento, tiene sentido mantener estos repositorios separados.

Tal vez estoy pensando en esto mal ... o tal vez no estoy al tanto de algún truco de hg.

Cualquier ayuda es apreciada.

Respuesta

2

Yo diría, olvídate de revisar los archivos binarios, eso solo lleva a la saturación del repositorio. IMO, cualquier salida de una compilación no se debe almacenar en el repositorio de origen.

¿Qué le parece enseñar a Sub2 a esperar encontrar Sub1 en ../Sub1? Luego, si encuentra que necesita trabajar en Sub2 independientemente de Sub1, cree un repositorio "Sub2_standalone", que extraiga Sub1 y Sub2 como sub-repos.

Por lo tanto, cuando se trabaja en todo, se obtendría:

Master/ 
Master/source/contrib/Sub1 
Master/source/contrib/Sub2 

Pero cuando acaba de trabajar en Sub2:

Sub2_standalone/ 
Sub2_standalone/Sub2 
Sub2_standalone/Sub1 
+0

Bueno, eso no es una solución totalmente terribles supongo y creo que debería resolver el problema, siempre y cuando todos los días tengo código dependiente en una configuración de tipo 'hermanos' . Por supuesto, luego termino con un repositorio adicional en Mercurial para mantener a los hermanos juntos, pero esa podría ser la compensación que tengo que hacer. Gracias por la idea, no lo había considerado. –

+0

Aún no está listo para marcar una respuesta, esperando que alguien de Selenic responda con una "mejor práctica" 0 –

+0

Un repositorio adicional no debería doler, ya que debería usar enlaces duros para los archivos en el repositorio. –

0

Si necesita que la estructura anidada, se podría utilizar un enlace simbólico para Sub1 debajo de Sub2, para asegurar que ambas versiones de Sub1 estén siempre en la misma revisión. Entonces realmente solo tienes una versión de Sub1, que parece ser lo que quieres.

en GNU/Linux que wouly ser un simple ln -s source/contrib/Sub1 source/contrib/Sub2/source/contrib/Sub1

+0

Sí, estamos aquí en Windows. Había considerado algo así, pero por lo que entiendo, los enlaces simbólicos no se traducen a uniones NTFS, sino que se traducen a algún tipo de archivo. Preferiría no seguir esa ruta –

+0

En realidad, he usado esta táctica dentro de Windows a través de la herramienta LinkShell (http://lifehacker.com/5530931/link-shell-extension-creates-windows-symlinks-with -facilitar) –

Cuestiones relacionadas