ant-contrib - if / then / else задача - PullRequest
       13

ant-contrib - if / then / else задача

13 голосов
/ 25 февраля 2011

Я использую 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

Это зависит от того факта, что я использую задачу равенства с ${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>

Ответы [ 5 ]

34 голосов
/ 25 февраля 2011

В 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>
15 голосов
/ 25 февраля 2011

Свойства муравья очень трудно переписать (если не невозможно).Вам нужна переменная .Они также определены в JAR Ant Contrib.

Редактирование вашего примера:

  <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>
2 голосов
/ 27 ноября 2012

Я знаю, что это старая версия, но она может пригодиться другим, ищущим решение.

чтобы переназначить свойство без использования 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>  

затем в любом месте муравья, просто назовите это как тег свойства

<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. В такой ситуации, когда используется команда , имеет смысл использовать sinnce ant-contrib уже загружен, и может быть быстрее при обработке.

Надеюсь, это поможет.

2 голосов
/ 27 декабря 2011
<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 для сброса свойства.

0 голосов
/ 31 января 2013

Можно повторно назначить значение свойства, используя 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'.

...