【问题标题】:Target runs even if dependency target condition false即使依赖目标条件为假,目标也会运行
【发布时间】:2022-07-20 08:58:15
【问题描述】:

令我惊讶的是,即使目标(通过AfterTargets)没有运行,目标也会运行:

<Target Name="StepOne" AfterTargets="PostBuildEvent" Condition="false">
    <Message Text="StepOne" Importance="high"/>
</Target>

<Target Name="StepTwo" AfterTargets="StepOne">
    <Message Text="StepTwo" Importance="high"/>
</Target>

输出:

1>StepTwo

有什么方法可以让一连串目标在其中一个出现错误条件时停止?添加DependsOnTargets="StepOne" 没有帮助。 CallTarget 有效,但属性不会与我想要的后续目标共享。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    MSBuild 创建所有目标的依赖关系图。然后将按顺序调用目标。条件不会更改依赖关系图,并且在调用目标之前不会检查条件。

    目标链不会停止,因为其中一个目标的条件是错误的。

    但是一个目标可以设置在其他目标的条件下使用的属性。例如:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" TreatAsLocalProperty="IsStepOneEnabled">
        <PropertyGroup>
            <!-- IsStepOneEnabled: default to true if not set; normalize to true|false -->
            <IsStepOneEnabled Condition="'$(IsStepOneEnabled)' == ''">true</IsStepOneEnabled>
            <IsStepOneEnabled Condition="'$(IsStepOneEnabled)' != 'true'">false</IsStepOneEnabled>
    
            <!-- IsStepOne: initilize to false -->
            <IsStepOne>false</IsStepOne>
        </PropertyGroup>
    
        <Target Name="Test">
            <Message Text="Test" />
            <Message Text="Step One will be run." Condition="$(IsStepOneEnabled)"/>
        </Target>
    
        <Target Name="StepOne" AfterTargets="Test" Condition="$(IsStepOneEnabled)">
            <PropertyGroup>
                <IsStepOne>true</IsStepOne>
            </PropertyGroup>
            <Message Text="StepOne" />
        </Target>
    
        <Target Name="StepTwo" AfterTargets="StepOne" Condition="$(IsStepOne)">
            <Message Text="StepTwo" />
        </Target>
    </Project>
    

    将它保存在一个名为 test.proj 的文件中,然后像使用命令一样运行它:

    msbuild test2.proj
    

    输出将是:

    测试: 测试 将运行第一步。 第一步: 第一步 第二步: 第二步

    使用命令运行它:

    msbuild test2.proj /p:IsStepOneEnabled=false
    

    输出将是:

    测试: 测试

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2017-12-13
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2013-09-20
      • 2018-01-30
      • 1970-01-01
      相关资源
      最近更新 更多