因此,我在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开始)。
最佳答案
如此处所述:http://ant.apache.org/manual/properties.html
从Ant 1.8.0开始,您可以改为使用属性扩展。值为true(或启用或启用)将启用该项目,而值为false(或禁用或禁用)将禁用该项目。其他值仍假定为属性名称,因此只有在定义了命名属性的情况下才启用该项目。
这是一些非常微妙的信息。因此,您代码中发生的事情是${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
。关于java - Ant 条件属性扩展无法按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18342850/