问题 尝试...最终在MsBuild中等效


无论测试目标是成功还是失败,如何在“测试”目标运行后运行某个清理任务(如 尝试......终于 用C#/ Java构造。


11313
2017-08-21 18:04


起源



答案:


Target元素有一个 的OnError 您可以将属性设置为在错误时执行的目标,但由于它仅在目标出错时才执行,因此它只解决了一半的情况。

您是否考虑过将目标链接在一起来代表您要执行的测试“步骤”?

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

'TestInitialization'目标是您可以执行任何测试初始化​​的目标,'Test'目标执行测试,'TestCleanup'目标执行任何类型的测试后清理。

然后,使用。执行这些目标 CallTarget 任务,使用 RunEachTargetSeparately 属性设置为 真正。这将执行 所有 目标,无论成功与否。

完整的样本如下:

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

12
2017-08-22 00:02



刚刚来测试这个,它完美无缺。感谢相当完整的例子。 - ripper234
NP!很高兴它有效! - Zach Bonham
很好的答案,虽然知道如何'重新抛出',继续尝试/最终类比会很好。无论如何都可能需要执行清理,但构建仍然失败。 - Sebastian Good
+1好点! - Zach Bonham
我很困惑:我认为“重新抛出”的方法就是使用 OnError 属性 覆盖 CoreBuild目标。您可以定义要在出错时执行的目标,并且如果构建失败,它将始终运行,并且您仍然会收到构建失败的通知。 - Dave


答案:


Target元素有一个 的OnError 您可以将属性设置为在错误时执行的目标,但由于它仅在目标出错时才执行,因此它只解决了一半的情况。

您是否考虑过将目标链接在一起来代表您要执行的测试“步骤”?

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

'TestInitialization'目标是您可以执行任何测试初始化​​的目标,'Test'目标执行测试,'TestCleanup'目标执行任何类型的测试后清理。

然后,使用。执行这些目标 CallTarget 任务,使用 RunEachTargetSeparately 属性设置为 真正。这将执行 所有 目标,无论成功与否。

完整的样本如下:

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

12
2017-08-22 00:02



刚刚来测试这个,它完美无缺。感谢相当完整的例子。 - ripper234
NP!很高兴它有效! - Zach Bonham
很好的答案,虽然知道如何'重新抛出',继续尝试/最终类比会很好。无论如何都可能需要执行清理,但构建仍然失败。 - Sebastian Good
+1好点! - Zach Bonham
我很困惑:我认为“重新抛出”的方法就是使用 OnError 属性 覆盖 CoreBuild目标。您可以定义要在出错时执行的目标,并且如果构建失败,它将始终运行,并且您仍然会收到构建失败的通知。 - Dave


或者使用 <OnError> 在错误的情况下调用你的目标,和 DependsOnTargets 要么 CallTarget 在正常情况下调用相同的目标。


0
2017-09-03 04:22