lunes, 17 de septiembre de 2007

Autoversionar assemblies con una tarea de MSBuild

Luego de un tiempo sin posts a causa de falta de tiempo volvemos a la carga con algo bastante interesante. La historia es así, me encontraba trabajando en un proyecto el cual se encuentra formado por nueve proyectos individuales con sus correspondiente sub proyectos, entre ellos librerías comunes para otros proyectos, y con cada nueva característica o cada nuevo bug en una librería era necesario recompilar una cantidad de proyectos medio molesta con sus consecuentes cambios de versión, esto me llevó a investigar MSBuild, si bien ya conocía NAnt en esta empresa no son muy amigos de proyectos por fuera de lo que es el arsenal de Microsoft, pensé en ver cómo solucionar estos problemas con MSBuild y puse manos a la investigación.

Incrementar la versión de los assemlbies automáticamente

Lo primero que pensé es que es necesario contar con una forma sencilla de incrementar la versión de los assemblies, por supuesto que antes que nada es necesario decir cómo han de ser numeradas las versiones, teniendo en cuentra que para el control de código se utiliza Visual Source Safe queda claro que el modelo de revisiones de archivos que utiliza SVN no es el más adecuado, por lo tanto me volqué por el modelo de Microsoft, para quienes no lo conozcan s así. Version.Revision.yyMMdd.Build, bien, navegando por la web econtré muy interesante este post el cual me llevó a esto, una pequeña (y olvidada en el tiempo) utilidad que hace justamente esto, autoincrementar la versión de un assembly con el formato de Microsoft sin necesidad de nuestra intervención, perfecto, antes que demos saltos de alegría hay que tener en cuenta algo, tiene un hermoso bug que nunca ha sido solucionado (y a esto me refería con olvidada en el tiempo) y es el siguiente:

esta aplicación fue escrita en 2005, bien, por lo tanto en el momento que fue probada, digamos a mitad de año, generó este tipo de números

1.0.050701.20

Perfecto, si nos detenemos en la parte de la revisión, la que utiliza la fecha para generar el número, vemos 50701, nada raro, el único detalle es que internamente este número es un Int16 cuyo mayor valor puede ser......65535, por lo tanto deja de funcionar en 2007, caramba, la solución más elegante es discutible, algunas alternativas se pueden ver aquí, sin embargo, la solución sugerida por el grupo de desarrollo de MSBuild es esta, y es la que adopte, simplemente modificando a mano un archivo de configuración se desestima el año en la generación del número de revisión y en su lugar se coloca un sospechoso "01", en fin. Explicaciones a parte veamos cómo se usa.

Instalación

Para la instación sólo es necesario correr el setup y registrar la librería en el GAC.

Utilización

Antes que nada tenemos que hacer botón derecho sobre nuestro proyecto y seleccionar "Unload project", echo esto hacemos nuevamente botón derecho y vemos la opción "Edit....", la seleccionamos y nos aparece un xml con la información que toma el MSBuild para realizar la compilación, para utilizar la extesión es necesario agregar al final, la siguiente línea:

<import project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets">

Y Es todo, cada vez que hagamos un Build se incrementará la versíón del assembly. En otra entrada vamos a ver cómo solucionamos el problema de realizar Builds automáticos de todo.

Actualización: La solución es ir a buscar "yyMMdd".%program files%\MSBuild\Microsoft\AssemblyInfoTask editar el archivo Microsoft.VersionNumber.targets, buscar la siguiente cadena

yyMMdd

y reeemplazarla por

01MMdd

En definitiva fijamos la parte de año en 01 para que nunca alcance más de 65535

4 comentarios:

Pablus dijo...

Hola, buenisimo el tip, el blog es excelente, primera ves que lo veo, estoy entrando almundillo del c#, me alegra poder contar con ayudas como esta, ojala y arreglen ese bug, en mi trabajo es necesario lo de la fecha de publicacion por ahora la obtengo directamente con un datetime, me imagino que no es facil arreglar ese problema con el int16. ya me subscribi, para estar al tanto. gracias..

Leonardo Micheloni dijo...

Gracias por tu comentario, la solución creo que pasa por modificar la librería para que genere el número de versión de otro modo y listo.

Eduardo dijo...

Hola:
Y como puedo obtener el instalador de MsBuild o de donde lo descargo?

Gran blog.
Saludos.

Leonardo Micheloni dijo...

Gracias por tu comentario Eduardo, el MSBuild viene dentro del Visual Studio, es la herramienta que éste utiliza internamente para hacer las tareas de compilación.Saludos.