web-dev-qa-db-fra.com

Ant si autre condition?

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 

38
jonney

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.

37
Mads Hansen

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

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

14
Mark O'Connor

Depuis la version 1.9.1, vous pouvez utiliser une condition if: set: https://ant.Apache.org/manual/ifunless.html

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

0
Laxman G