Ant条件任务

时间:2013-01-31 12:31:49

标签: ant conditional-statements short-circuiting

我无法找到这个问题的答案,正如您将看到的,理解我正在尝试进行逆向工程的build.xml是如何工作的并不重要。不过我确实认为这个问题有一定的效力。

在这个build.xml中,我有以下代码段:

<condition property="tests.complete">
    <isset property="no.tests" />
</condition>
<condition property="tests.complete">
    <and>
        <uptodate>
            ...
        </uptodate>
        <uptodate>
            ...
        </uptodate>
        <uptodate>
            ...
        </uptodate>
        <not>
            <available ... />
        </not>
        <not>
            <isset ... />
        </not>
    </and>
</condition>

我明白如果在遇到这段代码之前设置了属性no.tests,那么在第一个条件中属性tests.complete将被设置为true,无论第二个条件任务发生什么,这个属性在离开代码段时将保持设置为true。我的问题是,鉴于属性tests.complete由第一个条件设置,第二组条件测试是否会被评估?

1 个答案:

答案 0 :(得分:0)

只能设置干净(未定义)属性。如果您的房产已经设置,则不执行任何操作。

所以,不,不评估第二组条件。您可以使用以下代码进行测试:

<target name="run">
    <property name="no.tests" value="true"/>
    <condition property="tests.complete">
        <isset property="no.tests" />
    </condition>
    <echo message="${tests.complete}"/> <!-- prints true -->

    <condition property="tests.complete" else="false">
        <isset property="whatever" /> <!-- property whatever is not set -->
    </condition>
    <echo message="${tests.complete}"/> <!-- prints true as well! -->
</target>

您也可以使用相反的方法进行测试:

<target name="run">
    <property name="whatever" value="true"/>
    <condition property="tests.complete" else="false">
        <isset property="no.tests" /> <!-- no.tests isn't defined -->
    </condition>
    <echo message="${tests.complete}"/> <!-- prints false -->

    <condition property="tests.complete" else="false">
        <isset property="whatever" /> <!-- the property whatever is defined -->
    </condition>
    <echo message="${tests.complete}"/> <!-- prints false as well! -->
</target>