Sunday, April 10, 2016

MS Build project with Assembly version update

(1) evt.trading.build .\1\1.sln are the solution/build file structure
(2) msbuild .\Evt.Trading.Build /property:Configuration=Release /p:BUILD_NUMBER="1.0.17.239" 
(3) msbuild path C:\Program Files (x86)\MSBuild\14.0\Bin
(4) 1.sln can have C++/CLI project, may consider Nuget file repo for non-nugget lib.
(5) on Team City, BUILD_NUMBER need to be defined.
(6) TAP_WPF is the shell Title = Assembly.GetExecutingAssembly().GetName().Version.ToString();



<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="14.0" DefaultTargets="Compile">
  <ItemGroup>
    <BuildArtifacts  Include=".\__buildartifacts" />
    <SolutionFile Include=".\1\1.sln" />
  </ItemGroup>
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration> <!-- msbuild /property:Configuration=Release-->
    <SolutionRoot>$(MSBuildProjectDirectory)</SolutionRoot>
  </PropertyGroup>
  
  <Target Name="Clean" >
    <RemoveDir Directories ="@(BuildArtifacts)" />
  </Target>
  
  <Target Name="Init" DependsOnTargets="Clean" >
   <MakeDir Directories="@(BuildArtifacts)" />
  </Target>
  
  <Target Name="Compile" DependsOnTargets="Init;UpdateAssemblyVersion;">
    <MSBuild  Projects="@(SolutionFile)" Targets="Rebuild"  Properties="OutDir=%(BuildArtifacts.FullPath);Configuration=$(Configuration)"/>
  </Target>


<UsingTask TaskName="RegexTransform" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
        <ParameterGroup>
            <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" />
        </ParameterGroup>
        <Task>
            <Using Namespace="System.IO" />
            <Using Namespace="System.Text.RegularExpressions" />
            <Using Namespace="Microsoft.Build.Framework" />
            <Code Type="Fragment" Language="cs">
                <![CDATA[
            foreach(ITaskItem item in Items) {
              string fileName = item.GetMetadata("FullPath");
              string find = item.GetMetadata("Find");
              string replaceWith = item.GetMetadata("ReplaceWith");
              
              if(!File.Exists(fileName)) {
                Log.LogError(null, null, null, null, 0, 0, 0, 0, String.Format("Could not find version file: {0}", fileName), new object[0]);
              }
              string content = File.ReadAllText(fileName);
              File.WriteAllText(
                fileName,
                Regex.Replace(
                  content,
                  find,
                  replaceWith
                )
              );
            }
          ]]>
            </Code>
        </Task>
    </UsingTask>

    <ItemGroup>
        <RegexTransform Include="$(SolutionRoot)\TAP_WPF\Properties\AssemblyInfo.cs">
            <Find>(?<major>\d+)\.(?<minor>\d+)\.\d+\.(?<revision>\d+)</Find>
            <ReplaceWith>$(BUILD_NUMBER)</ReplaceWith>
        </RegexTransform>
    </ItemGroup>
  
    <Target Name="UpdateAssemblyVersion" Condition="'$(BUILD_NUMBER)' != ''">   <!--  msbuild .\Evt.Trading.Build /property:Configuration=Release /p:BUILD_NUMBER="1.0.17.235"-->
        <RegexTransform Items="@(RegexTransform)" />
    </Target>


</Project>


No comments:

Post a Comment