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:
- 发行版本:2020.3.23.0
3/24/20:
- 调试版本:2020.3.24.0
- 调试版本:2020.3.24.1
- 调试版本:2020.3.24.2
- 发布版本:2020.3.24.0
- 调试版本:2020.3.24.3
- 发行版本:2020.3.24.1
本质上:前三个数字是 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工程记得把它的MyCustomTask
dll存起来
2) 瞄准你的主项目,然后创建两个名为 Debug.txt
、Release.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
(执行清理然后构建),它将版本号设置为零,并且开始重新投掷。
总的来说,这是我尝试实现的理想解决方案。
上下文:
我使用 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:
- 发行版本:2020.3.23.0
3/24/20:
- 调试版本:2020.3.24.0
- 调试版本:2020.3.24.1
- 调试版本:2020.3.24.2
- 发布版本:2020.3.24.0
- 调试版本:2020.3.24.3
- 发行版本:2020.3.24.1
本质上:前三个数字是 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工程记得把它的MyCustomTask
dll存起来
2) 瞄准你的主项目,然后创建两个名为 Debug.txt
、Release.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
(执行清理然后构建),它将版本号设置为零,并且开始重新投掷。
总的来说,这是我尝试实现的理想解决方案。