1

所以,我在 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 开始的条件参数扩展)。

4

1 回答 1

2

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

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

这是一些非常微妙的信息。因此,您的代码中发生的事情${docbase.dir}被扩展为“/tmp/docbase”。这不是 true/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.

于 2013-08-20T19:22:23.423 回答