MSBuild автоматически увеличивает версию сборки для выпуска / отладки - PullRequest
0 голосов
/ 25 марта 2020

Контекст:

Я использую 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

По существу: первые три числа - год / месяц / день, потому что дата выпуска часто важна. Затем используйте автоматическое увеличение номеров версий для выпусков в течение того же дня. Инкремент на отладку полезен, так что я могу подтвердить, что загружается и запускается правильная версия программного обеспечения, но я не хочу запутанно высоких цифр в выпусках сборки. Я могу поиграть с каким-то дополнительным индикатором для отладочных сборок, но я смогу сам в этом разобраться.

Вопрос:

Как я могу автоматически увеличивать сборка в течение того же дня, имея отдельную версию для отладки и выпуска? В идеале решения, которые не добавляют дополнительных зависимостей, предпочтительнее, но если есть нет пути без него, то это приемлемо.

1 Ответ

1 голос
/ 27 марта 2020

Версия сборки MSBuild с автоинкрементом по-разному для выпуска / отладки

В общем случае , MSBuild не имела функции для просмотра номера версии очевидной добавочной сборки но только используемая временная метка сборки системы определяет порядок сборки, который вы использовали ранее.

Фактически , если вы создаете пользовательское свойство в msbuild для записи номера версии инкрементной сборки , ему все еще нужно использовать объект для хранения записи, и если он не используется, параметр повторно инициализируется для каждой сборки (атрибут msbuild может быть идентифицирован только в msbuild).

Так что идеальный способ это которые используют текстовый файл в качестве промежуточного звена. Вы можете следовать моему решению:

Решение

1) создать пользовательскую задачу msbuild , которая увеличивает значение на свойство записи.

- a) Создайте проект библиотеки классов с именем MyCustomTask, затем щелкните правой кнопкой мыши проект -> Добавить ссылку -> ссылка Microsoft.Build.Framework dll и Microsoft.Build.Utilities.v4.0 dll.

enter image description here

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

enter image description here

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 (при котором выполняется очистка, а затем сборка), он установит номер версии в ноль и начнет перебрасывание.

В целом, это идеальное решение, которое я пытаюсь реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...