Hemos usado svn:externals
apuntando al código compartido en práctica desde hace algunos años. Sin embargo, hemos tenido algunos problemas interesantes que probablemente debería considerar antes de usarlo. Esta es la estructura que tenemos:
root
+---common
| +---lib1
| | \---trunk
| | +---include
| | \---src
| \---lib2
| \---trunk
| +---include
| \---src
+---proj1
| \---trunk
| +---include
| | \---common
| \---src
| \---common
\---proj2
\---trunk
+---include
| \---common
\---src
\---common
Los directorios common
tanto include
y src
en un proyecto contienen definiciones externas que tiran en las bibliotecas comunes:
c:\dev> svn pget -v svn:externals proj1\trunk\src\common
Properties on 'c:\dev\proj1\trunk\src\common':
svn:externals : lib1 http://.../common/lib1/trunk/src
lib2 http://.../common/lib2/trunk/src
El problema que se nos ha acabado es multifacético pero está relacionado con el etiquetado y la ramificación de nuestra fuente a medida que los proyectos cambian a lo largo del tiempo. La definición externa que mostró anteriormente tiene algunos problemas muy graves si usted quiere tener reproducibles construye:
- Se refiere a un objetivo dinámico -
trunk
.
- No se refiere a una revisión explícita.
Cuando se bifurca usando svn copy
, los elementos externos se copian textualmente, ya que en realidad son solo propiedades asociadas al objeto. Algunos de los otros comandos svn (commit
, checkout
y export
) realmente interpretan las propiedades. Cuando etiqueta un proyecto, realmente desea conservar el estado del proyecto para siempre. Esto significa que debe "anclar" los elementos externos a una revisión específica, por lo que debe cambiar la definición externa para hacer referencia explícita a la revisión que desee (por ejemplo, "lib1 -r42 http://.../common/lib1/trunk/src"
). Esto resuelve una faceta del problema.
Si tiene que mantener varias ramas incompatibles del código común, entonces debe especificar qué rama desea explícitamente junto con (posiblemente) la revisión.
Huelga decir que esto puede ser un poco dolor de cabeza. Afortunadamente, alguien en el terreno de Subversion escribe el script svncopy.pl
que automatiza parte de este lío. Todavía estamos (y hemos estado) luchando con algunas de las dificultades para respaldar esto en un producto desplegado en el campo con un montón de código compartido y un mandato de tres versiones diferentes en el campo en cualquier momento.
Si avanza por esta ruta, asegúrese de considerar cómo va a mantener los vínculos a medida que los proyectos crecen y cambian. Hemos descubierto que un poco de tiempo pensando en un proceso nos servirá de mucho.
Relacionados: http://stackoverflow.com/questions/130447/should-i-store-all-projects-in-one -repository-or-mulitiple – harpo
Intenté investigar las preguntas SVN de SO, pero realmente no vi esta situación. Por supuesto, como dije, no pude entender cómo se debe formular la consulta ... – cwallenpoole