是否有一种方法可以在执行目标依赖项之前检查Ant目标条件

时间:2012-02-21 11:00:02

标签: ant ant-contrib

我试图在我的程序中避免使用antcall,因此尝试将antcall目标移动到目标依赖项。现在我有一个情况:

<target name="test" depends="a,b,c" />

<target name="a" depends="a1,a2,a3" />
<target name="b" depends="b1,b2,b3" />
<target name="c" depends="c1,c2,c3" />

直到现在一切正常。但是,如果我只想跳过目标'c'及其执行依赖,

<target name="c" depends="c1,c2,c3" if="skip.c" />  (considering the property "skip.c" is already set)

现在将执行目标'c'的依赖关系,然后检查条件“skip.c” 是否有更好的解决方案,其中目标及其依赖关系不会根据条件执行。

如果有条件的话,我总是可以去打电话。但寻找任何其他选择。
我无法检查c1,c2,c3目标中的“skip.c”条件,因为我有更多条件来检查这些目标。

2 个答案:

答案 0 :(得分:2)

在查看“if / unless”测试之前,将处理目标的所有依赖项。 Ant中没有内置方法来避免这种情况。

相反,一种好的方法是将依赖项与操作分开。请尝试以下方法:

<target name="test" depends="a,b,c" />

<target name="a" depends="a1,a2,a3" />
<target name="b" depends="b1,b2,b3" />
<target name="c">
    <condition property="skip.c.and.dependents">
        <or>
            <isset property="prop1"/>
            <isset property="prop2"/>
        </or>
    </condition>

    <antcall target="do-c-conditionally"/>
</target>

<target name="do-c-conditionally" unless="skip.c.and.dependents">
    <antcall target="do-c"/>
</target>

<target name="do-c" depends="c1,c2,c3">
    <!-- former contents of target c -->
</target>

答案 1 :(得分:0)

为避免使用antcall,您需要将条件放在每个子任务中。 查看名称&#34; skip.c&#34;,它可能是&#34;除非&#34;条件,像这样:

<target name="test" depends="a,b,c" />

<target name="a" depends="a1,a2,a3" />
<target name="b" depends="b1,b2,b3" />
<target name="c" depends="c1,c2,c3" />

<target name="c1" unless="skip.c">
        <!-- contents of target c1 -->
</target>
<target name="c2" unless="skip.c">
        <!-- contents of target c2 -->
</target>
<target name="c3" unless="skip.c">
        <!-- contents of target c3 -->
</target>

如果您需要在运行任务&#34; c&#34;时进行条件处理,您可以在目标中执行此操作&#34; check_run_c&#34;像这样:

<target name="test" depends="a,b,c" />

<target name="a" depends="a1,a2,a3" />
<target name="b" depends="b1,b2,b3" />
<target name="c" depends="check_run_c,c1,c2,c3" />
<target name="check_run_c">
    <condition property="run.c">
        <!-- set this property "run.c" if the  "c*" targets should run... -->
        <or>
            <isset property="prop1"/>
            <isset property="prop2"/>
        </or>
    </condition>
</target>
<target name="c1" if="run.c">
        <!-- contents of target c1 -->
</target>
<target name="c2" if="run.c">
        <!-- contents of target c2 -->
</target>
<target name="c3" if="run.c">
        <!-- contents of target c3 -->
</target>

如果任务中还有说明&#34; c&#34;您只想有条件地运行:

<target name="test" depends="a,b,c" />

<target name="a" depends="a1,a2,a3" />
<target name="b" depends="b1,b2,b3" />
<target name="c" depends="check_run_c,c1,c2,c3" if="run.c" >
        <!-- contents of target c -->
</target>
<target name="check_run_c">
    <condition property="run.c">
        <!-- set this property "run.c" if the  "c*" targets should run... -->
        <or>
            <isset property="prop1"/>
            <isset property="prop2"/>
        </or>
    </condition>
</target>
<target name="c1" if="run.c">
        <!-- contents of target c1 -->
</target>
<target name="c2" if="run.c">
        <!-- contents of target c2 -->
</target>
<target name="c3" if="run.c">
        <!-- contents of target c3 -->
</target>