【问题标题】:ant-contrib - if/then/else taskant-contrib - if/then/else 任务
【发布时间】:2011-07-04 05:59:25
【问题描述】:

我正在使用 ant,但我遇到了 if/then/else 任务 (ant-contrib-1.0b3.jar) 的问题。 我正在运行一些可以使用下面的 build.xml 进行简化的东西。

我期待从 'ant -Dgiv=Luke' 获得消息

input name: Luke
should be overwritten with John except for Mark: John

但似乎属性“giv”没有在 if/then/else.. 中被覆盖。

input name: Luke
should be overwritten with John except for Mark: Luke

这是否取决于我将 equals 任务与 ${giv} 一起使用的事实? 否则我的代码有什么问题?

build.xml 代码:

<project name="Friend" default="ifthen" basedir=".">

<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
    </classpath>
</taskdef>

<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
    <equals arg1="${giv}" arg2="Mark" />
    <then>
    </then>
    <else>
        <property name="giv" value="John" />
    </else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>

【问题讨论】:

    标签: ant ant-contrib


    【解决方案1】:

    Ant 属性很难覆盖(如果不是不可能的话)。您需要的是Variable。这些也在 Ant Contrib JAR 中定义。

    编辑您的示例:

      <target name="ifthen"> 
        <var name="Evangelist" value="${giv}" />
        <echo message="input name: ${Evangelist}" />
        <if>
          <equals arg1="${Evangelist}" arg2="Mark" />
          <then>
          </then>
          <else>
            <var name="Evangelist" value="John" />
          </else>
        </if>   
        <echo message="should be overwritten with John except for Mark: ${Evangelist}" />
     </target>
    

    【讨论】:

    • 谢谢DoctorRuss,正如对ruffp 的评论,我不知道属性不可重写。我将使用变量。
    • 这不完全正确,我能够在 ant 1.8 中执行以下操作:
    • Ant 属性是不可变的。这意味着一旦设置了属性,就无法更改它的值。
    【解决方案2】:

    在 Ant 中,属性总是设置一次,之后该变量就不能再更改了。

    下面是使用标准 Ant(不带 ant-contrib)的解决方案,这对于不想要额外依赖的人可能很有用。

    <target name="test"  >
        <echo message="input name: ${param}" />
    
        <condition property="cond" >
            <equals arg1="${param}" arg2="Mark" />
        </condition>
    </target>
    
    <target name="init" depends="test" if="cond"> 
        <property name="param2" value="Mark" />
    </target>
    
    <target name="finalize" depends="init"> 
        <property name="param2" value="John" />
        <echo message="should be overwritten with John except for Mark: ${param2}" />
    </target>
    

    【讨论】:

    • 谢谢 ruffp,我更喜欢 DoctorRuss 提供的其他带有变量的解决方案。我不知道属性不可重写。例如: [echo] color=red
    • 没问题,我根据我的平台给出了解决方案,并且我能够测试(因为我不使用 ant-contrib)。无论如何,我的回答可以帮助一些像我一样不使用 ant-contrib 的人。干杯
    • 谢谢。正是我的情况 - 需要一个没有 ant-contrib 的答案。 +1
    • 由于多个目标节点,无法在 maven-antrun-plugin 中使用。
    【解决方案3】:
    <project name="Friend" default="ifthen" basedir=".">
    
    <property name="runningLocation" location="" />
    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>
    
    <target name="ifthen">
    <echo message="input name: ${giv}" />
    <if>
        <equals arg1="${giv}" arg2="Mark" />
        <then>
        </then>
        <else>
            <var name="giv" unset="true"/>
            <property name="giv" value="John" />
        </else>
    </if>
    <echo message="should be overwritten with John except for Mark: ${giv}" />
    </target>
    </project>
    

    我们也可以使用var 任务来取消设置属性。

    【讨论】:

      【解决方案4】:

      我知道这已经过时了,但对其他寻求解决方案的人来说应该很方便。

      要在不使用 ant-contrib 的情况下重新分配属性,请使用带有脚本的 macrodef。

      <macrodef name="property-change"> 
          <attribute name="name"/>
          <attribute name="value"/>
          <sequential> 
              <script language="javascript"><![CDATA[
                  project.setProperty("@{name}", "@{value}");
              ]]></script>
          </sequential> 
      </macrodef>  
      

      然后在ant中的任何地方,就像属性标签一样调用它

      <property-change name="giv" value="John"/>
      

      要在原始版本的 xml 中实现它,它看起来像这样:

      <project name="Friend" default="ifthen" basedir=".">
      
      <property name="runningLocation" location="" />
      <taskdef resource="net/sf/antcontrib/antcontrib.properties">
          <classpath>
              <pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
          </classpath>
      </taskdef>
      
      <target name="ifthen">
      <echo message="input name: ${giv}" />
      <if>
          <equals arg1="${giv}" arg2="Mark" />
          <then>
          </then>
          <else>
              <property-change name="giv" value="John" />
          </else>
      </if>
      <echo message="should be overwritten with John except for Mark: ${giv}" />
      </target>
      </project>
      

      此示例仅作为编写宏以替换 ant-contrib 中的 命令的示例。在这种情况下,使用 命令时,使用 更有意义,因为 ant-contrib 已经加载,并且 的处理速度可能更快。

      希望这会有所帮助。

      【讨论】:

      • 有用的宏。如果您由于某种原因不能/不想使用 ant-contrib,可能会很方便。
      • 谢谢。我现在经常使用这些类型的脚本来增强我的 ant 环境,而无需添加 JAR 文件。
      【解决方案5】:

      可以使用 ant-contrib 'propertycopy' 重新分配属性的值。这是使用 ant-contrib 变量的替代方法。 这样可以覆盖属性“giv”。

      <target name="ifthen">
        <echo message="input name: ${giv}" />
        <if>
          <equals arg1="${giv}" arg2="Mark" />
          <then>
          </then>
          <else>
            <property name="tempName" value="John" />
            <propertycopy name="giv" from="tempName" override="true" />
          </else>
        </if>
        <echo message="should be overwritten with John except for Mark: ${giv}" />
      </target>
      

      请注意,这假定属性 tempName 尚未设置为“John”以外的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多