How can I change AssemblyProduct, AssemblyTitle using MSBuild?

前端 未结 3 1794
独厮守ぢ
独厮守ぢ 2020-12-01 02:53

I have an MSBuild script which compiles my existing solution but I\'d like to change some properties of one of the projects within the solution at compile-time, inc

相关标签:
3条回答
  • 2020-12-01 03:32

    Sneal's answer was very helpful, but I'd like to show what I actually ended up doing. Instead of editing csproj files (there are several) I instead added tasks to my build script. Here's a snippet:

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

    Then, I can override my variables from the command line, or a batch script, like so:

    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%
    
    0 讨论(0)
  • 2020-12-01 03:41

    You're on the right track with the MSBuild Extension Pack.

    I find the easiest way to conditionally generate the assembly details at build time is to add an "AssemblyVersion" target directly to my .csproj file(s) that require an updated AssemblyInfo file. You can add the target directly to each csproj file that requires an updated AssemblyInfo file, or as I prefer to do it, create a custom targets file with the AssemblyVersion target and have each csproj file include your custom targets file.

    Either way you likely want to use the MSBuild Extension Pack or the MSBuild Community Tasks to use their respective AssemblyInfo task.

    Here's some code from our build scripts:

    <!-- 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>
    
    0 讨论(0)
  • 2020-12-01 03:51
    <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>
    
    0 讨论(0)
提交回复
热议问题