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