Ant条件属性扩展无法按预期工作

时间:2013-08-20 18:50:26

标签: java ant conditional target

所以,我在ant中有这个设置:

<target name="context">
    <echo>docbase: ${docbase.dir}</echo>
    <antcall target="_context.docbase"/>
    <antcall target="_context.nodocbase"/>
</target>

<target name="_context.docbase" if="${docbase.dir}">
    <echo>Context with docbase</echo>
    <context.md docbase="..."/>
</target>

<target name="_context.nodocbase" unless="${docbase.dir}">
    <echo>Context without docbase</echo>
    <context.md/>
</target>

docbase.dir设置为true或false时,事情会按预期运行。但是,当docbase.dir由于某种原因设置为实际值(例如,/tmp/docbase)时,它会点击_context.nodocbase目标而不是预期的_context.docbase目标。

阅读文档意味着如果扩展属性不是“假”常量的“真实”之一,那么它将像以前一样解释它,但这不是我所看到的。

我做错了什么?我应该采用不同的方法吗?

注意:我正在使用Ant 1.8.2(并且条件参数扩展在1.8.0开始)。

1 个答案:

答案 0 :(得分:2)

如上所述:http://ant.apache.org/manual/properties.html

  

从Ant 1.8.0开始,您可以使用属性扩展;值为true(或on或yes)将启用该项,而false(或off或no)将禁用该项。其他值仍被假定为属性名称,因此仅在定义了命名属性时才启用该项。

这是一些非常微妙的信息。那么代码中发生的事情是${docbase.dir}扩展为“/ tmp / docbase”。那不是真/ on / yes / false / off / no所以Ant 然后会查找名为“/ tmp / docbase”的属性。它无法找到它,因此它运行unless


这是一个我希望澄清事情的例子。这只会运行if目标:

<project name="MyProject" default="context" basedir=".">
    <target name="context">
        <echo>docbase: ${docbase.dir}</echo>
        <property name="/tmp/docbase" value="i exist!"/>
        <antcall target="_context.docbase"/>
        <antcall target="_context.nodocbase"/>
    </target>

    <target name="_context.docbase" if="${docbase.dir}">
        <echo>Context with docbase</echo>
    </target>

    <target name="_context.nodocbase" unless="${docbase.dir}">
        <echo>Context without docbase</echo>
    </target>
</project>

重要的是这一行:

        <property name="/tmp/docbase" value="i exist!"/>

由于该属性已定义,因此它将运行if而不是unless