Hacemos esto con xUnit.net para nuestras compilaciones automatizadas. Usamos CruiseControl.net
(y estamos probando TeamCity). La tarea de MSBuild que ejecutamos para la integración continua cambia automáticamente el número de compilación por nosotros, por lo que el archivo ZIP de compilación resultante contiene un conjunto de DLL y EXE con las versiones adecuadas.
Nuestro archivo MSBuild contiene una referencia de UsingTask para una DLL que reemplaza expresiones regulares: (puede usar esta DLL, ya que también está cubierta por la licencia MS-PL)
<UsingTask
AssemblyFile = "3rdParty \ CodePlex.MSBuildTasks.dll"
TaskName = "CodePlex.MSBuildTasks.RegexReplace" />
A continuación, extraemos el número de compilación, que el sistema CI proporciona automáticamente. También puede hacer que su proveedor de control de fuente proporcione el número de revisión de la fuente si lo desea, pero encontramos que el número de compilación en el sistema de CI era más útil, porque no solo puede ver los resultados de integración por el número de compilación de CI, sino que también proporciona un enlace de nuevo a los conjuntos de cambios que se incluyeron en la compilación.
<! - Intentos en cascada de encontrar un número de compilación ->
<Condición del grupo de propiedades = "'$ (BuildNumber)' == ''">
<BuildNumber> $ (BUILD_NUMBER) </BuildNumber>
</PropertyGroup>
<Condición del grupo de propiedades = "'$ (BuildNumber)' == ''">
<BuildNumber> $ (ccnetlabel) </BuildNumber>
</PropertyGroup>
<Condición del grupo de propiedades = "'$ (BuildNumber)' == ''">
<BuildNumber> 0 </BuildNumber>
</PropertyGroup>
(Probamos BUILD_NUMBER, que es de TeamCity, luego ccnetlabel, que es de CC.net, y si ninguno está presente, usamos 0 por defecto para poder probar el script de compilación automatizado manualmente).
A continuación, tenemos una tarea que establece el número de compilación en un archivo GlobalAssemblyInfo.cs que vinculamos a todos nuestros proyectos:
<Nombre de destino = "SetVersionNumber">
<RegexReplace
Patrón = 'AssemblyVersion \ ("(\ d + \. \ D + \. \ D +) \. \ D +" \)'
Reemplazo = 'AssemblyVersion ("$ 1. $ (BuildNumber)")'
Archivos = 'GlobalAssemblyInfo.cs' />
<Exec Command = "attrib -r xunit.installer \ App.manifest" />
</Target>
Esto busca el atributo AssemblyVersion y reemplaza el número de versión abcd con abcBuildNumber. Por lo general, dejaremos la fuente marcada en el árbol con las primeras tres partes del número de constructor fijo y la cuarta en cero (fe, hoy es 1.0.2.0).
En su proceso de compilación, asegúrese de que la tarea SetVersionNumber precede a su tarea de compilación. Al final, usamos nuestra tarea Zip para comprimir los resultados de la compilación de modo que tengamos un historial de los binarios para cada compilación automatizada.