【问题标题】:Ant conditional property expansion not working as expectedAnt 条件属性扩展未按预期工作
【发布时间】:2013-08-20 18:50:25
【问题描述】:

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

【问题讨论】:

  • 你用的是什么版本的ant?
  • 好点,我加了一条注释。

标签: java ant conditional target


【解决方案1】:

这里提到: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 then 会查找名为“/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。

【讨论】:

  • 感谢您解释其中的微妙之处,但我不知道这有什么更好的地方。显然我的 'docbase.dir' 是参数化的,所以你说我需要用我的参数的值的名称创建一个新属性,但我需要有条件地这样做,所以我回到了原点。
  • 我没有提出解决方案,我只是提出证据来支持我所说的并举例说明问题。
  • @rjcarr 事实是你不能像你想要的那样使用if 或unless。它接受“true/on/yes/false/off/no/或声明参数的名称”。这些是您唯一的选择。
  • @rjcarr 但如果你想要一个不同的解决方案,你可以使用这个:ant-contrib.sourceforge.net/tasks/tasks/if.html
  • 好的,再次感谢您的解释并说明为什么它不能按照我尝试的方式工作。
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 2020-04-26
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多