Existe-t-il une condition if/else que je puisse utiliser pour une tâche Ant?
Voici ce que j'ai écrit jusqu'à présent:
<target name="prepare-copy" description="copy file based on condition">
<echo>Get file based on condition</echo>
<copy file="${some.dir}/true" todir="." if="true"/>
</target>
Le script ci-dessus copiera le fichier si une condition est vraie. Et si la condition est fausse et que je souhaite copier un autre fichier? Est-ce possible à Ant?
Je pourrais passer un param à la tâche ci-dessus et m'assurer que le param qui est passé est
L'attribut if
n'existe pas pour <copy>
. Il devrait être appliqué au <target>
.
Vous trouverez ci-dessous un exemple d'utilisation de l'attribut depends
d'une cible et des attributs if
ET unless
pour contrôler l'exécution de cibles dépendantes. Un seul des deux devrait être exécuté.
<target name="prepare-copy" description="copy file based on condition"
depends="prepare-copy-true, prepare-copy-false">
</target>
<target name="prepare-copy-true" description="copy file based on condition"
if="copy-condition">
<echo>Get file based on condition being true</echo>
<copy file="${some.dir}/true" todir="." />
</target>
<target name="prepare-copy-false" description="copy file based on false condition"
unless="copy-condition">
<echo>Get file based on condition being false</echo>
<copy file="${some.dir}/false" todir="." />
</target>
Si vous utilisez ANT 1.8+, vous pouvez utiliser l'extension de propriété et il évaluera la valeur de la propriété pour déterminer la valeur booléenne. Donc, vous pouvez utiliser if="${copy-condition}"
au lieu de if="copy-condition"
.
Dans ANT 1.7.1 et versions antérieures, vous spécifiez le nom de la propriété. Si la propriété est définie et a une valeur (même une chaîne vide), elle sera évaluée à true.
Vous pouvez également le faire avec ant contrib si task .
<if>
<equals arg1="${condition}" arg2="true"/>
<then>
<copy file="${some.dir}/file" todir="${another.dir}"/>
</then>
<elseif>
<equals arg1="${condition}" arg2="false"/>
<then>
<copy file="${some.dir}/differentFile" todir="${another.dir}"/>
</then>
</elseif>
<else>
<echo message="Condition was neither true nor false"/>
</else>
</if>
La syntaxe décalée utilisant des conditions sur la cible (décrite par Mads) est le seul moyen pris en charge d'exécuter une exécution conditionnelle dans le noyau ANT.
ANT n'est pas un langage de programmation et lorsque les choses se compliquent, je choisis d'incorporer un script dans ma construction, comme suit:
<target name="prepare-copy" description="copy file based on condition">
<groovy>
if (properties["some.condition"] == "true") {
ant.copy(file:"${properties["some.dir"]}/true", todir:".")
}
</groovy>
</target>
ANT prend en charge plusieurs langages (voir script task), ma préférence va à Groovy en raison de sa syntaxe concise et du fait qu’elle fonctionne très bien avec la construction.
Toutes mes excuses, David, je ne suis pas fan de ant-contrib .
Depuis la version 1.9.1, vous pouvez utiliser une condition if: set: https://ant.Apache.org/manual/ifunless.html
<project name="Build" basedir="." default="clean">
<property name="default.build.type" value ="Release"/>
<target name="clean">
<echo>Value Buld is now ${PARAM_BUILD_TYPE} is set</echo>
<condition property="build.type" value="${PARAM_BUILD_TYPE}" else="${default.build.type}">
<isset property="PARAM_BUILD_TYPE"/>
</condition>
<echo>Value Buld is now ${PARAM_BUILD_TYPE} is set</echo>
<echo>Value Buld is now ${build.type} is set</echo>
</target>
</project>
Dans mon cas, DPARAM_BUILD_TYPE=Debug
s'il est fourni, je dois construire pour Debug, sinon je dois construire la version Release. J'écris comme ci-dessus condition cela a fonctionné et j'ai testé comme ci-dessous cela fonctionne très bien pour moi.
Et la propriété ${build.type}
nous pouvons la transmettre à une autre cible ou à un macrodef pour le traitement que je fais dans mon autre ant.
D:\>ant -DPARAM_BUILD_TYPE=Debug
Buildfile: D:\build.xml
clean:
[echo] Value Buld is now Debug is set
[echo] Value Buld is now Debug is set
[echo] Value Buld is now Debug is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds
D:\>ant
Buildfile: D:\build.xml
clean:
[echo] Value Buld is now ${PARAM_BUILD_TYPE} is set
[echo] Value Buld is now ${PARAM_BUILD_TYPE} is set
[echo] Value Buld is now Release is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds
Cela fonctionne pour moi d’implémenter la condition afin de pouvoir vous aider.