Propiedades y Compartición de Documentos entre Proyectos: svn:externals

Conforme evolucionan los proyectos descubrimos que existen áreas comunes entre ellos que pueden factorizarse y ser reutilizadas en varios proyectos.

Una forma de gestionar la compartición de subproyectos entre proyectos es mediante la propiedad svn:externals, la cual nos permite incluir contenidos en otro repositorio en nuestra copia de trabajo.

Por ejemplo, en la mayoría de los artículos y apuntes que escribo en LATEX comparto la bibliografía. En vez de tener múltiples ficheros .bib de bibliografía por artículo prefiero tener uno garantizando así la consistencia. Del mismo modo comparto los ficheros de estilo LATEX y las definiciones de comandos LATEX. Así en el proyecto svn de estos apuntes que lee tenemos:

pp2@nereida:~/Lbook$ svn proplist .
Propiedades en '.':
  svn:externals
pp2@nereida:~/Lbook$ svn propget svn:externals
perlbib svn+ssh://casiano@arlom.pcg.ull.es/var/svn/casiano/BIBTEX/PERLBIB/trunk
booktt svn+ssh://casiano@arlom.pcg.ull.es/var/svn/casiano/booktt/trunk
lhplabels svn+ssh://casiano@arlom.pcg.ull.es/var/svn/casiano/LHP/perlexamples/labels.pl
Subversion no hace automáticamente commit de los cambios en las copias de los subproyectos externos. Es necesario cambiar al directorio en cuestión y ejecutar svn commit.
pp2@nereida:~/Lbook$ svn status -qu
Estado respecto a la revisión:   5463

Averiguando el estado del recurso externo en 'perlbib'
Estado respecto a la revisión:   5463

Averiguando el estado del recurso externo en 'booktt'
Estado respecto a la revisión:   5463

He aquí un ejemplo de como establecer svn:externals:

MacBookdeCasiano:LPLDI2011 casiano$ svn propset svn:externals \
   'code svn+ssh://casiano@orion.pcg.ull.es/var/svn/casiano/PL/PLconferences/softwarepracticeandexperience/code' .
property 'svn:externals' set on '.'
Obsérvese el uso de las comillas simples protegiendo al segundo argumento de svn propset. Ahora un update cargará el subproyecto externo:
MacBookdeCasiano:LPLDI2011 casiano$ svn update

Fetching external item into 'code'
A    code/MyopicPPCR.eyp
A    code/pascalnestedeyapp2.eyp
A    code/noPackratSolvedExpRG2.eyp
A    code/pascalnestedeyapp3.eyp
A    code/pascalenumeratedvsrangePPCR.eyp
A    code/reducereduceconflictnamefirst.eyp
A    code/Cplusplus.eyp
A    code/pascalenumeratedvsrangesolvedviadyn.eyp
A    code/dynamicgrammar.eyp
A    code/Range.eyp
A    code/nopackratSolved.eyp
A    code/reducereduceconflictPPCRwithAction.eyp
A    code/Myopic.eyp
A    code/noLRk_exp.eyp
A    code/Calc.eyp
A    code/input_for_dynamicgrammar.txt
A    code/pascalenumeratedvsrange.eyp
A    code/noPackratSolvedExpRG.eyp
A    code/pascalenumeratedvsrangenested.eyp
A    code/reducereduceconflictPPCR.eyp
A    code/nopackratPPCR.eyp
A    code/noPackratSolvedExp.eyp
A    code/Cplusplus2.eyp
A    code/MyopicSolved.eyp
A    code/pascalenumeratedvsrangesolvedviadyn2.eyp
A    code/noLRk_expSolved.eyp
A    code/noPackratSolvedExpRGconcept.eyp
A    code/reducereduceconflict.eyp
A    code/nopackrat.eyp
Updated external to revision 6318.

Updated to revision 6318.
MacBookdeCasiano:LPLDI2011 casiano$

Consejo tomado del libro de subversión:

You should seriously consider using explicit revision numbers in all of your externals definitions. Doing so means that you get to decide when to pull down a different snapshot of external information, and exactly which snapshot to pull. Besides avoiding the surprise of getting changes to third-party repositories that you might not have any control over, using explicit revision numbers also means that as you backdate your working copy to a previous revision, your externals definitions will also revert to the way they looked in that previous revision, which in turn means that the external working copies will be updated to match they way they looked back when your repository was at that previous revision. For software projects, this could be the difference between a successful and a failed build of an older snapshot of your complex codebase.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19