web-dev-qa-db-fra.com

ant-contribs - si / alors / else tâche

J'utilise la fourmi, et j'ai un problème avec une tâche if/alors/else, (ant-contribs-1.0b3.jar). Je cours quelque chose qui peut être simplifié avec Build.XML ci-dessous.

Je m'attends à obtenir de 'ANT -DGIV = LUKE' LE MESSAGE

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

mais il semble que la propriété "GIV" n'est pas écrasée à l'intérieur si/puis/sinon ..

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

Est-ce que cela dépend du fait que j'utilise est égal à la tâche avec ${giv}? Sinon ce qui ne va pas dans mon code?

construire.xml Code:

<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>
13
Francesco

Les propriétés de fourmi sont très difficiles à écraser (sinon impossible). Ce dont vous avez besoin est une variable . Celles-ci sont également définies dans le pot de fourmis de fourmi.

Modification de votre exemple:

  <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>
16
DoctorRuss

Dans une propriété ANT est toujours définie une fois, après cette variable n'est plus altérable.

Ici suit une solution à l'aide d'une fourmi standard (sans ant-contrib) qui pourrait être utile pour les personnes qui ne veulent pas de dépendance supplémentaire.

<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>
34
рüффп
<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>

Nous pouvons utiliser var tâche pour non défini la propriété également.

2
rashok

Je sais que c'est vieux, mais devrait s'avérer utile aux autres recherchant une solution.

pour réaffecter une propriété sans utiliser Ant-fort, utilisez MacRodef avec un script.

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

ensuite, n'importe où dans la fourmi, appelez cela comme la balise de propriété

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

pour implémenter cela dans votre version originale de XML, cela ressemblerait à ceci:

<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>

Cet échantillon est donné purement à titre d'exemple sur la rédaction d'une macro pour remplacer la commande <var> dans les anti-contrib. Dans une situation comme celle-ci, où la commande <if> est utilisée, il est plus logique d'utiliser <var> sinnce ant-contribs est déjà chargé et <var> pourrait être plus rapide dans le traitement.

J'espère que cela t'aides.

2
Armand