Попробуйте... наконец, эквивалент в MsBuild

Как я могу запустить определенную задачу очистки после запуска моей целевой задачи "Тест", независимо от того, преуспел или не прошел целевой тест (например, try... наконец построить в С#/Java).

Ответ 1

Элемент Target имеет атрибут OnError, который вы можете установить для цели для выполнения при ошибке, но поскольку она выполняется только в том случае, если цель имеет ошибку, она разрешает только половину вашего сценария.

Рассматривали ли вы объединение целых целей для представления тестовых "шагов", которые вы хотели бы выполнить?

<PropertyGroup>
    <TestSteps>TestInitialization;Test;TestCleanup</TestSteps>
</PropertyGroup>

Цель "TestInitialization" заключается в том, где вы можете выполнить любую инициализацию теста, цель "Test" выполняет тест, цель "TestCleanup" выполняет любой вид посттестирования.

Затем выполните эти цели с помощью задачи CallTarget, используя атрибут RunEachTargetSeparately, установленный на True. Это выполнит все цели, независимо от успеха или сбоя.

Ниже приведен полный образец:

<Project DefaultTargets = "TestRun"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

    <!-- Insert additional tests between TestInitialization and TestCleanup as necessary -->
    <PropertyGroup>
        <TestSteps>TestInitialization;Test;TestCleanup</TestSteps>
    </PropertyGroup>

   <Target Name = "TestRun">

      <CallTarget Targets="$(TestSteps)" RunEachTargetSeparately="True" />

   </Target>

    <Target Name = "TestInitialization">
        <Message Text="Executing Setup..."/>
    </Target>

    <Target Name = "Test">
        <Message Text="Executing Test..."/>

        <!-- this will fail (or should unless you meet the conditions below on your machine) -->
        <Copy 
          SourceFiles="test.xml"
          DestinationFolder="c:\output"/>
    </Target>

    <Target Name = "TestCleanup">
        <Message Text="Executing Cleanup..."/>
    </Target>

</Project>

Ответ 2

Или используйте <OnError> для вызова вашей цели в случае ошибки и DependsOnTargets или CallTarget для вызова одной и той же цели в обычном случае.