Pregunta

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

He aquí un fragmento de mi escritura de la estructura:

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

Tengo una DLL ejecutables principales y varios que se compilan. Soy consciente de la href="http://msbuildextensionpack.codeplex.com/" rel="noreferrer"> Extensión Paquete MSBuild

¿Puedo cambiar selectivamente las propiedades AssemblyInfo en tiempo de compilación?

¿Fue útil?

Solución

Usted está en el camino correcto con el paquete de extensión de MSBuild.

Me parece la forma más sencilla de generar condicionalmente los detalles de montaje en el tiempo de construcción es añadir una "AssemblyVersion" destino directamente a archivo (s) de mi .csproj que requiere un archivo actualizado AssemblyInfo. Puede añadir el destino directamente a cada archivo csproj que requiere un archivo actualizado AssemblyInfo, o como yo prefiero hacerlo, crear un archivo de destino personalizado con el objetivo AssemblyVersion y tienen cada archivo csproj incluir su archivo de destino personalizado.

De cualquier manera es probable que quieren usar el paquete de extensión de MSBuild o las tareas MSBuild comunidad a utilizar su respectiva tarea AssemblyInfo.

Aquí hay un código de nuestros scripts de construcció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>

Otros consejos

La respuesta de sneal fue muy útil, pero me gustaría mostrar lo que en realidad terminó haciendo. En lugar de editar archivos csproj (hay varios) que en vez añadido tareas a mi escritura de la estructura. He aquí un fragmento:

    <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>

A continuación, puedo anular mi variables desde la línea de comandos o un archivo 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top