msbuild - ¿Cómo cambiar el número de versión de ensamblaje usando AssemblyInfoTask?
msbuild-task (4)
Estoy tratando de automatizar el proceso para configurar la Versión para todas las DLL, después de pasar un tiempo, llegué a conocer la tarea de AssemblyInfo
con la que es más probable que se logre.
Así que seguí adelante y lo instalé, específicamente la versión 1.0.51130.0 .
Después de la instalación, agregué manualmente la etiqueta de Import
(descargando cada proyecto) de AssemblyInfoTask
en archivos .cspoj
(la solución tiene más de 35 archivos de proyecto).
<Import Project="$(MSBuildExtensionsPath)/Microsoft/AssemblyInfoTask/Microsoft.VersionNumber.Targets"/>
Luego modifiqué el archivo Microsoft.VersionNUmber.Target
que se instalará en la ruta: C:/Program Files/MSBuild/Microsoft/AssemblyInfoTask
, y modifiqué la siguiente sección:
<!-- Properties for controlling the Assembly Version -->
<PropertyGroup>
<AssemblyMajorVersion>4</AssemblyMajorVersion>
<AssemblyMinorVersion>0</AssemblyMinorVersion>
<AssemblyBuildNumber></AssemblyBuildNumber>
<AssemblyRevision></AssemblyRevision>
<AssemblyBuildNumberType>DateString</AssemblyBuildNumberType>
<AssemblyBuildNumberFormat>01MMdd</AssemblyBuildNumberFormat>
<AssemblyRevisionType>AutoIncrement</AssemblyRevisionType>
<AssemblyRevisionFormat>00</AssemblyRevisionFormat>
</PropertyGroup>
<!-- Properties for controlling the Assembly File Version -->
<PropertyGroup>
<AssemblyFileMajorVersion>4</AssemblyFileMajorVersion>
<AssemblyFileMinorVersion>0</AssemblyFileMinorVersion>
<AssemblyFileBuildNumber></AssemblyFileBuildNumber>
<AssemblyFileRevision></AssemblyFileRevision>
<AssemblyFileBuildNumberType>DateString</AssemblyFileBuildNumberType>
<AssemblyFileBuildNumberFormat>01MMdd</AssemblyFileBuildNumberFormat>
<AssemblyFileRevisionType>AutoIncrement</AssemblyFileRevisionType>
<AssemblyFileRevisionFormat>00</AssemblyFileRevisionFormat>
</PropertyGroup>
A continuación, establezco la versión del archivo assemblyInfo.cs
a 1.0.0.0
en cada proyecto. Finalmente lo guardé y lo cerré, volví a abrir la solución y construí. ¡Trabaja como un campeón!
Ahora, lo que se quiere es personalizar la Versión a 4.0.1053.1
donde 10
es el indicador de parte del año que es 2010 y 53
denota el número de la semana, al menos 1
denota el número de revisión.
¿Cómo lograr esto utilizando la tarea AssemblyInfo
? Me encontré con varias publicaciones que una nueva versión de la tarea de AssemblyInfo
está disponible en Build Extension Pack.
He instalado MSBuild Extension Pack diciembre de 2010 y su versión es MSBuild Extension Pack 4.0.2.0 Installer
Cómo finalmente conseguí que esto funcionara MSBuild versión 12 (VS 2013).
- Usé Nuget para obtener el paquete de la comunidad MSBuildTasks
- Edité mi archivo .csproj y agregué una ruta para importar el paquete:
<Import Project="../packages/MSBuildTasks.1.5.0.235/build/MSBuildTasks.targets" Condition="Exists(''../packages/MSBuildTasks.1.5.0.235/build/MSBuildTasks.target'')"/>
- Descubrí el Regex para cambiar solo el número de Revisión en el archivo AssemblyInfo.cs:
(?<=AssemblyFileVersion/("[0-9]/.[0-9]/.[0-9]/.)(/*)
que no es compatible con XML, por lo que debe cambiarse a:
(?<=AssemblyFileVersion/("[0-9]/.[0-9]/.[0-9]/.)(/*)
-
<Target Name="BeforeBuild">
sección<Target Name="BeforeBuild">
y agregue lo siguiente:
<Target Name="BeforeBuild">
<FileUpdate Files="properties/AssemblyInfo.cs"
Regex="(?<=AssemblyFileVersion/("[0-9]/.[0-9]/.[0-9]/.)(/*)"
ReplacementText="$(Revision)" />
</Target>
- Al ejecutar MSBuild, se agregó la propiedad "Revisión" a la línea de comandos, por ejemplo,
msbuild.exe myProject.csproj /t:Build /p:Configuration=Release;Revision=12345
Hago esto en Jenkins al tener una compilación de paquete que se parametriza usando el tipo de parámetro List Subversion Tags. La etiqueta de Subversion debe seguir el formato del número de versión (major.minor.revision.build), por ejemplo, tags/2.0.0.1
. El nombre de la etiqueta se asigna a un parámetro de Jenkins, por ejemplo, $VERSION
convierte en 2.0.0.1
Utilizo la tarea WriteLinesToFile
WriteLinesToFile para escribir el atributo de ensamblaje en un segundo archivo junto con PropertyInfo.cs llamado VersionInfo.cs. Una vez registrado en el control de código fuente, este solo contiene un número de versión predeterminado:
// Do not change this. The version is set on package builds only by setting the AsmVersion MSBuild property
[assembly: System.Reflection.AssemblyVersion("0.0.0.0")]
La compilación del paquete en el servidor de compilación pasa en la versión a través del parámetro AsmVersion:
/p:AsmVersion=$VERSION
El archivo .csproj se modifica para que tenga un objetivo BeforeBuild
(Visual Studio crea uno comentado):
<Target Name="BeforeBuild">
<WriteLinesToFile
Condition=" ''$(AsmVersion)'' != '''' " File="Properties/VersionInfo.cs"
Overwrite="True"
Lines="[assembly: System.Reflection.AssemblyVersion("$(AsmVersion)")] // Generated by build" />
</Target>
Al compilar en Visual Studio, o sin pasar por AsmVersion, su ensamblaje tendrá una versión predeterminada de 0.0.0.0. Al crear la compilación del paquete, obtendrá el número de compilación deseado.
Primero ... use un globalassemblyinfo.cs que esté enlazado desde cada proyecto. Agregue su como archivo vinculado a cada proyecto. Esto significa que actualiza un archivo, no más de 30 archivos assemblyinfo ... y luego:
utilizar MSBuild.Community.Tasks ....
Luego llame
<AssemblyInfo CodeLanguage="CS"
OutputFile="$(VersionFile)"
AssemblyCompany="Company"
AssemblyProduct="Product"
AssemblyCopyright="Copyright © Company 2011"
ComVisible="false"
AssemblyVersion="$(BUILD_NUMBER)"
AssemblyFileVersion="$(BUILD_NUMBER)" />
Asumiendo que tienes algo como:
<Import Project="./tasks/MSBuild.Community.Tasks.Targets"/>
Actualización para los archivos .csproj del estilo de .NET Core: si se ha encontrado con esta pregunta después de haber realizado la transición al nuevo formato .csproj utilizado por .NET Core, puede configurar la propiedad Versión (no es necesario molestarse con las tareas de MSBuild) .