Цель сборки, используемая Visual Studio для инкрементной сборки через командную строку msbuild - PullRequest
0 голосов
/ 23 мая 2019

Я создал задачу в наших проектах C # для проектов автоматической версии, когда они создаются (изменения вносятся) в режиме выпуска. Версионная часть работает отлично. Тем не менее, все проекты строятся независимо от того, действительно ли проект изменился, когда это было сделано из командной строки. Это приводит к тому, что проекты не требуют версий. Сборка в Visual Studio работает, неизмененные проекты не создаются, однако мы создали инструмент для автоматической сборки с использованием msbuild.exe и используем это как временное исправление, пока работаем над Bamboo, и этот метод всегда выполняет слепую сборку, даже если нет изменений в проекте. Мне нужно иметь возможность определить, были ли внесены изменения в проект.

Что-то вроде

'$ (wasSourceUpdated)' == 'true' или какое-то целевое условие для использования в моей пользовательской цели управления версиями.

Вот пример моего задания по управлению версиями в наших проектах

<Import Project="..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets" Condition="Exists('..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets') And '$(Configuration)|$(Platform)' == 'Release|AnyCPU' And '$(DeployOnBuild)' != 'true'" />

Я также проверил это и это статьи безрезультатно.

EDIT

Мне нужно, чтобы задание было выполнено до фактического выполнения сборки, чтобы пометить сгенерированные сборки новыми версиями

РЕДАКТИРОВАТЬ 2

Что я действительно ищу, так это условие для запуска CoreCompile или для запуска CoreCompile снова, когда я обнаружу, что сборка была обновлена ​​

Что я пробовал до сих пор:

<Project>
<PropertyGroup>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup>
    <_AssemblyTimestampBeforeCompile>%(IntermediateAssembly.ModifiedTime)</_AssemblyTimestampBeforeCompile>
</PropertyGroup>
<PropertyGroup>
    <_AssemblyTimestampAfterCompile>%(IntermediateAssembly.ModifiedTime)</_AssemblyTimestampAfterCompile>
</PropertyGroup>
<PropertyGroup>
    <_ProjectVersioned Condition="'$(_ProjectVersioned)'==''">false</_ProjectVersioned>
</PropertyGroup>
<Target Name="IncrementVersionBeforeBuild" AfterTargets="CoreCompile" Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)' and '$(_ProjectVersioned)' == 'false'">
 <Message Text="Before $(_AssemblyTimestampBeforeCompile) After $(_AssemblyTimestampAfterCompile)" Importance="High"/>
    <IncrementVersion
  ProjectPath="$(MSBuildProjectFullPath)"
    VersionRule="3.3.0.+"
    FileName="Properties\AssemblyInfo.cs">
    </IncrementVersion>
</Target>
<PropertyGroup>
    <TaskPath>$(MSBuildThisFileDirectory)..\Tasks\AutoVersionTask\AutoVersionTask\bin\Debug</TaskPath>
</PropertyGroup>
<!-- Sample import for projects
<Import Project="..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets" Condition="Exists('..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets') And '$(Configuration)|$(Platform)' == 'Release|AnyCPU' And '$(DeployOnBuild)' != 'true'" />
-->
<UsingTask AssemblyFile="$(TaskPath)\AutoVersionTask.dll" TaskName="AutoVersionTask.IncrementVersion" />

<PropertyGroup>
    <_ProjectVersioned>true</_ProjectVersioned>
</PropertyGroup>

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Итак, спасибо Лэнсу за то, что он помог мне понять MSBuild до такой степени, что я понимаю проблему лучше.

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

Входные и выходные данные совпадают с целью CoreCompile и гарантируют, что задача будет выполняться только в том случае, если в источнике произошли изменения

Вот цель, которую я запустил, которая работает:

<?xml version="1.0" encoding="utf-8"?>
<Project>
    <PropertyGroup>
        <CoreCompileDependsOn>
        $(CoreCompileDependsOn);
        IncrementVersionBeforeBuild
        </CoreCompileDependsOn>
    </PropertyGroup>
    <Target Name="IncrementVersionBeforeBuild"
            Inputs="$(MSBuildAllProjects);
            @(Compile);                               
            @(_CoreCompileResourceInputs);
            $(ApplicationIcon);
            $(AssemblyOriginatorKeyFile);
            @(ReferencePath);
            @(CompiledLicenseFile);
            @(EmbeddedDocumentation); 
            $(Win32Resource);
            $(Win32Manifest);
            @(CustomAdditionalCompileInputs)"
            Outputs="@(DocFileItem);
             @(IntermediateAssembly);
             @(_DebugSymbolsIntermediatePath);                 
             $(NonExistentFile);
             @(CustomAdditionalCompileOutputs)"
    >
        <Message Text="Version Task running" Importance="High"/>
        <IncrementVersion
      ProjectPath="$(MSBuildProjectFullPath)"
        VersionRule="3.3.0.+"
        FileName="Properties\AssemblyInfo.cs">
        </IncrementVersion>
    </Target>
    <PropertyGroup>
        <TaskPath>$(MSBuildThisFileDirectory)..\Tasks\AutoVersionTask\AutoVersionTask\bin\Debug</TaskPath>
    </PropertyGroup>
    <UsingTask AssemblyFile="$(TaskPath)\AutoVersionTask.dll" TaskName="AutoVersionTask.IncrementVersion" />

    <PropertyGroup>
        <_ProjectVersioned>true</_ProjectVersioned>
    </PropertyGroup>
</Project>
0 голосов
/ 23 мая 2019

Обычно мы можем добавить следующий скрипт в файл .csproj:

  <PropertyGroup>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
  </PropertyGroup>
  <Target Name="AutoVersionWhenBuild" AfterTargets="CoreBuild"
          Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'">
    <Message Importance="high" Text="Auto-version begins when changes are made!"/>
    <!--<AutoVersionTask>Do your auto-version task here.</AutoVersionTask>-->
  </Target>

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

Что касается вашей ситуации:

Кажется, что ваши задачи и цель взяты из файла целей DXTAutoIncrementVersion.targets, вы можете открыть этот файл и изменить цель в нем на формат выше.

Кроме того: Проверьте связь между задачами , целями и .targets файлом.

1.MSBuild использует задачи для выполнения этих действий.

2. Целевые группы задач вместе.

3.MSBuild включает несколько файлов .targets, которые содержат элементы, свойства, цели и задачи для распространенных сценариев.

Так что вы можете либо modify your auto-version target in the xx.targets file, либо use the script above, and call the auto-version task in the AutoVersionWhenBuild target. Надеюсь, это поможет:)

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