所以,我在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
目标。
阅读文档意味着,如果展开的属性不是"truthy"或"falsy"常量中的一个,那么它只会像以前一样解释它,但这不是我所看到的。
我做错了什么?我应该使用不同的方法吗?
注意:我使用的是Ant 1.8.2(条件参数扩展从1.8.0开始)。
如前所述: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
。