Версия сборки MSBuild с автоинкрементом по-разному для выпуска / отладки
В общем случае , MSBuild не имела функции для просмотра номера версии очевидной добавочной сборки но только используемая временная метка сборки системы определяет порядок сборки, который вы использовали ранее.
Фактически , если вы создаете пользовательское свойство в msbuild для записи номера версии инкрементной сборки , ему все еще нужно использовать объект для хранения записи, и если он не используется, параметр повторно инициализируется для каждой сборки (атрибут msbuild может быть идентифицирован только в msbuild).
Так что идеальный способ это которые используют текстовый файл в качестве промежуточного звена. Вы можете следовать моему решению:
Решение
1) создать пользовательскую задачу msbuild , которая увеличивает значение на свойство записи.
- a) Создайте проект библиотеки классов с именем MyCustomTask
, затем щелкните правой кнопкой мыши проект -> Добавить ссылку -> ссылка 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) Затем соберите проект и не забудьте сохранить его MyCustomTask
dll.
2) Наведите ваш основной проект, а затем создайте два текстовых файла с именами Debug.txt
, Release.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
(при котором выполняется очистка, а затем сборка), он установит номер версии в ноль и начнет перебрасывание.
В целом, это идеальное решение, которое я пытаюсь реализовать.