Comment vérifier l'existence d'un dossier utilisant Ant?
Nous pouvons vérifier l'existence d'un fichier, mais pouvons-nous faire la même chose pour un dossier?
Vous utilisez la tâche disponible avec le type défini sur "dir".
Par exemple:
<available file="${dir}" type="dir"/>
La méthode standard pour effectuer un traitement conditionnel consiste à utiliser la tâche de condition } _. Dans l'exemple ci-dessous, l'exécution de doFoo fera écho à un message si le répertoire existe, alors que l'exécution de doBar fera écho à un message sauf si le répertoire existe.
La cible dir.check est requise par doFoo et doBar. Elle définit la propriété dir.exists sur true ou sur false, en fonction du résultat de la tâche disponible. La cible doFoo ne s'exécutera que si cette propriété est définie sur true et doBar ne s'exécutera que si elle n'est pas définie ou définie sur false.
<?xml version="1.0"?>
<project name="test" default="doFoo" basedir=".">
<property name="directory" value="c:\test\directory"/>
<target name="doFoo" depends="dir.check" if="dir.exists">
<echo>${directory} exists</echo>
</target>
<target name="doBar" depends="dir.check" unless="dir.exists">
<echo>${directory} missing"</echo>
</target>
<target name="dir.check">
<condition property="dir.exists">
<available file="${directory}" type="dir"/>
</condition>
</target>
</project>
Antelope fournit des tâches supplémentaires, notamment une tâche If qui peut simplifier le traitement (et pour moi, plus intuitif), vous pouvez télécharger les tâches Antelope à partir de la page de téléchargement .
Voici un petit exemple incorporant l'élément available
dans un test if
.
<!-- Test if a directory called "my_directory" is present -->
<if>
<available file="my_directory" type="dir" />
<then>
<echo message="Directory exists" />
</then>
<else>
<echo message="Directory does not exist" />
</else>
</if>
Attention : vous avez besoin d’ant-contrib.jar dans votre répertoire ANT_HOME\lib, sinon vous n’avez pas accès aux éléments if
et votre script échouera avec l’erreur suivante:
Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
Voici ma solution, qui ne nécessite pas de définir des propriétés et d'utiliser des cibles avec 'if' ou 'less':
Macro:
<macrodef name="assertDirAvailable">
<attribute name="dir" />
<sequential>
<fail message="The directory '@{dir}' was expected to be available but is not">
<condition>
<not>
<available file="@{dir}" type="dir" />
</not>
</condition>
</fail>
</sequential>
</macrodef>
Usage:
<assertDirAvailable dir="${dirToCheck}" />
Ma solution utilisant la version ANT 1.8, les versions plus anciennes risquent de ne pas fonctionner car/à moins que la syntaxe $ {evalTrueOrFalse} ne soit pas prise en charge.
<?xml version="1.0" encoding="UTF-8"?>
<project name="DoMagic" default="build" basedir=".">
<property environment="env" />
<property name="name" value="Do the ANT Magic" />
<property name="somedir" value="./must_exist_folder"/>
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp>
<target name="doMagic" if="${dir.exists}">
<echo message="Do the magic stuff" />
</target>
<target name="doUsage" unless="${dir.exists}">
<echo message="Do usage and help" />
</target>
<target name="build">
<echo message="Do the magic" />
<condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition>
<echo message="Folder found: ${dir.exists}" />
<antcall target="doCustomize"></antcall>
<antcall target="doUsage"></antcall>
</target>
</project>
http://ant.Apache.org/manual/properties.html#if+unless
[Si/sauf si] Dans Ant 1.7.1 et ses versions antérieures, ces attributs ne pouvaient être que des noms de propriétés. À partir de Ant 1.8.0, vous pouvez plutôt utiliser l'extension de propriété. Comparé au style plus ancien, cela vous donne une flexibilité supplémentaire.
Voici une autre approche, permet d’appeler une seule tâche sans utiliser ant-contrib.jar.
<target name="my-task" depends="dir-check">
<antcall target="my-task-install"/>
<antcall target="my-task-update"/>
</target>
<target name="my-task-install" unless="dir.exists" >
{some task}
</target>
<target name="my-task-update" if="dir.exists" >
{another task}
</target>
<target name="dir-check">
<condition property="dir.exists">
<available file="my-dir" type="dir" />
</condition>
</target>