msbuild assemblyinfo

¿Cómo puedo cambiar AssemblyProduct, AssemblyTitle usando MSBuild?



assemblyinfo (3)

Tengo un script de MSBuild que compila mi solución existente, pero me gustaría cambiar algunas de las propiedades de uno de los proyectos dentro de la solución en tiempo de compilación, que incluyen, entre otros, AssemblyProduct y AssemblyTitle.

Aquí hay un fragmento de mi script de compilación:

<Target Name="Compile" > <MSBuild Projects="../MySolution.sln" Properties="Configuration=MyReleaseConfig;Platform=x86" /> </Target>

Tengo un ejecutable principal y varias DLL compiladas. Soy consciente del paquete de extensión de MSBuild y sospecho que podría ayudarme a llegar a donde necesito estar, aunque no estoy seguro de cómo proceder.

¿Puedo cambiar selectivamente las propiedades de AssemblyInfo en el momento de la compilación?


Estás en el camino correcto con el paquete de extensión de MSBuild.

Encuentro que la forma más fácil de generar condicionalmente los detalles del ensamblaje en el momento de la compilación es agregar un objetivo "AssemblyVersion" directamente a mi (s) archivo (s). Puede agregar el destino directamente a cada archivo csproj que requiera un archivo AssemblyInfo actualizado o, si lo prefiero, cree un archivo de objetivos personalizado con el objetivo AssemblyVersion y haga que cada archivo csproj incluya su archivo de destinos personalizados.

De cualquier manera, es probable que desee utilizar el paquete de extensión de MSBuild o las tareas de la comunidad de MSBuild para usar su respectiva tarea de información de la asamblea.

Aquí hay algo de código de nuestros scripts de compilación:

<!-- Import the AssemblyInfo task --> <Import Project="$(MSBuildCommunityTasksPath)/MSBuild.Community.Tasks.Targets"/> <!-- Overriding the Microsoft.CSharp.targets target dependency chain --> <!-- Call our custom AssemblyVersion target before build, even from VS --> <PropertyGroup> <BuildDependsOn> AssemblyVersion; $(BuildDependsOn) </BuildDependsOn> </PropertyGroup> <ItemGroup> <AssemblyVersionFiles Include="$(MSBuildProjectDirectory)/Properties/AssemblyInfo.cs"/> </ItemGroup> <Target Name="AssemblyVersion" Inputs="@(AssemblyVersionFiles)" Outputs="UpdatedAssemblyVersionFiles"> <Attrib Files="%(AssemblyVersionFiles.FullPath)" Normal="true"/> <AssemblyInfo CodeLanguage="CS" OutputFile="%(AssemblyVersionFiles.FullPath)" AssemblyCompany="$(CompanyName)" AssemblyCopyright="Copyright $(CompanyName), All rights reserved." AssemblyVersion="$(Version)" AssemblyFileVersion="$(Version)"> <Output TaskParameter="OutputFile" ItemName="UpdatedAssemblyVersionFiles"/> </AssemblyInfo> </Target>


La respuesta de Sneal fue muy útil, pero me gustaría mostrar lo que realmente terminé haciendo. En lugar de editar archivos csproj (hay varios), en lugar de eso, agregué tareas a mi script de compilación. Aquí hay un fragmento de código:

<PropertyGroup> <ProductName>MyApp</ProductName> <CompanyName>MyCompany</CompanyName> <Major>1</Major> <Minor>0</Minor> <Build>0</Build> <Revision>0</Revision> </PropertyGroup> <ItemGroup> <AssemblyVersionFiles Include="../MyMainProject/Properties/AssemblyInfo.cs"/> </ItemGroup> <Target Name="AssemblyVersionMAIN" Inputs="@(AssemblyVersionFiles)" Outputs="UpdatedAssemblyVersionFiles"> <Attrib Files="%(AssemblyVersionFiles.FullPath)" Normal="true"/> <AssemblyInfo CodeLanguage="CS" OutputFile="%(AssemblyVersionFiles.FullPath)" AssemblyProduct="$(ProductName)" AssemblyTitle="$(ProductName)" AssemblyCompany="$(CompanyName)" AssemblyCopyright="© $(CompanyName) 2010" AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyInformationalVersion="$(Major).$(Minor).$(Build).$(Revision)"> <Output TaskParameter="OutputFile" ItemName="UpdatedAssemblyVersionFiles"/> </AssemblyInfo> </Target> <Target Name="Compile" DependsOnTargets="AssemblyVersionMAIN"> <MSBuild Projects="../MySolution.sln" Properties="Configuration=Release;Platform=x86;Optimize=true" /> </Target>

Luego, puedo anular mis variables desde la línea de comandos, o un script por lotes, así:

set MAJ=1 set MIN=2 set BLD=3 set REV=4 msbuild buildScript.xml /t:Compile /p:Major=%MAJ% /p:Minor=%MIN% /p:Build=%BLD% /p:Revision=%REV%


<Target Name="SetVersion"> <ItemGroup> <AssemblyInfoFiles Include="$(TargetDir)/**/AssemblyInfo.cs"/> </ItemGroup> <Message Text="change the Version number for:"/> <Message Text="%(AssemblyInfoFiles.FullPath)"/> <MSbuild.ExtensionPack.Framework.AssemblyInfo AssemblyInfoFiles="@(AssemblyInfoFiles)" AssemblyTitle="newTitle" AssemblyMajorVersion="2" AssemblyMinorVersion="0"/> </Target>