release/debug 的 MSBuild 自动递增构建版本不同

MSBuild auto increment build version differently for release/debug

上下文:

我使用 MSBuild 来构建我的项目。目前,我使用的是发布日期版本号,不幸的是,当同一天发布多个版本时,该版本号不够清晰。在 Directory.Build.props:

  <PropertyGroup>
    <Version>
      $([System.DateTime]::Now.Year).
      $([System.DateTime]::Now.Month).
      $([System.DateTime]::Now.Day).
      $([System.Convert]::ToUInt16(
          $([MSBuild]::Divide(
              $([System.DateTime]::Now.TimeOfDay.TotalSeconds),
              1.32
          ))
      ))
    </Version>
  </PropertyGroup>

目标:

创建如下所示的版本控制方案:

3/23/20:

3/24/20:

本质上:前三个数字是 year/month/day,因为发布日期通常很重要。然后在同一天对发布使用自动递增的版本号。增加调试很有用,因此我可以确认正在加载正确的软件版本并且 运行,但我不希望在发布版本中出现令人困惑的高数字。我可能会尝试使用一些额外的调试版本指示器,但我应该能够自己弄清楚。

问题:

我怎样才能在同一天自动增加构建,有一个单独的版本用于调试和发布?理想情况下,不添加额外依赖项的解决方案是首选,但如果没有 no 方法,那么它是可以接受的。

MSBuild auto increment build version differently for release/debug

一般, MSBuild 没有查看明显增量构建版本号的功能,只是使用系统构建的时间戳来确定构建顺序,因为你使用之前。

其实,如果在msbuild中创建自定义属性来记录增量构建的版本号,还是需要用实体来存储记录,如果没有使用,每次构建都会重新初始化该参数(msbuild属性只能在msbuild中识别)。

所以使用文本文件作为中间体的理想方式。您可以按照我的解决方案:

解决方案

1) 创建 a custom msbuild task 会增加记录 属性.

的值

--a) 创建一个名为 MyCustomTask 的 class 库项目,然后在项目上 Right-click --> 添加引用-- >reference Microsoft.Build.Framework dll 和 Microsoft.Build.Utilities.v4.0 dll.

--b) 将这些添加到 CustomTask.cs(这是将在 xxx.csproj 文件中使用的任务的名称)。

 public class CustomTask : Task
        {

            private int _number;
            [Required]
            public int number   //input taskitem
            {
                get { return _number; }

                set { _number = value; }

            }
            private int _lastnumber;
            [Output]
            public int LastNumber   //output value
            {
                get { return _lastnumber; }
                set { _lastnumber = value; }
             }

            public override bool Execute()   // Execution logic 
            {
                LastNumber = number + 1;
                return true;
            }
        }

--c)然后build工程记得把它的MyCustomTaskdll存起来

2) 瞄准你的主项目,然后创建两个名为 Debug.txtRelease.txt 的 txt 文件,并给每个文件一个初始值 0.

3) 将这些添加到您的 Directory.Build.props 文件中:

<Project>
  <UsingTask TaskName="CustomTask" AssemblyFile="xxxxxx\MyCustomTask\MyCustomTask\MyCustomTask\bin\Debug\MyCustomTask.dll(the local path of the dll)"> </UsingTask>    
  <PropertyGroup>
    <Record></Record>
  </PropertyGroup>

    <Target Name="WriteToFile1"  BeforeTargets="PrepareForBuild">
      <PropertyGroup>
      <Record Condition="'$(Configuration)'=='Debug' and !Exists('$(TargetPath)')">
        0
      </Record>
      <Record Condition="'$(Configuration)'=='Release'and !Exists('$(TargetPath)')">
        0
      </Record>
      </PropertyGroup>
      <ItemGroup Condition="'$(Configuration)'=='Debug'"> 
        <MyTextFile Include="Debug.txt">
        <Number>$(Record)</Number>
        </MyTextFile>
      </ItemGroup>
      <ItemGroup Condition="'$(Configuration)'=='Release'">
        <MyTextFile Include="Release.txt">
          <Number>$(Record)</Number>
        </MyTextFile>
      </ItemGroup>
      <WriteLinesToFile
        File="@(MyTextFile)"
        Lines="$(Record)"
        Overwrite="true"
        Encoding="Unicode" Condition="'$(Configuration)'=='Debug'"/>
      <WriteLinesToFile
        File="@(MyTextFile)"
        Lines="$(Record)"
        Overwrite="true"
        Encoding="Unicode" Condition="'$(Configuration)'=='Release'"/>
      <PropertyGroup>
        <Version>
          $([System.DateTime]::Now.Year).
          $([System.DateTime]::Now.Month).
          $([System.DateTime]::Now.Day).
          $(Record)
        </Version>
      </PropertyGroup>
    </Target>

  <Target Name="ReadLineFromFile" BeforeTargets="WriteToFile1">
    <ReadLinesFromFile File="Debug.txt" Condition="'$(Configuration)'=='Debug'">
      <Output TaskParameter="Lines" PropertyName="Record"/>
    </ReadLinesFromFile>
    <ReadLinesFromFile File="Release.txt" Condition="'$(Configuration)'=='Release'">
      <Output TaskParameter="Lines" PropertyName="Record"/>
    </ReadLinesFromFile>

    <CustomTask number="$(Record)">
      <Output TaskParameter="LastNumber" PropertyName="Record"/>
    </CustomTask>
    </Target>
</Project>

4) 当你执行一个依赖 Build 来显示 属性 Version 的任务时,它会如你所愿地工作。

请注意 它适用于增量构建,如果您单击 Rebuild(执行清理然后构建),它将版本号设置为零,并且开始重新投掷。

总的来说,这是我尝试实现的理想解决方案。