web-dev-qa-db-fra.com

Ai-je un moyen de vérifier l'existence d'un répertoire dans Ant (pas un fichier)?

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?

61

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 .

93
Rich Seller

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. 
29
Dan J

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}" />
9
bcody

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>
  • ANT 1.6 ou Early ANT 1.7 ne fonctionne pas, passez à la version ANT 1.8.
  • Attributs cibles if et sauf si évalue la syntaxe $ {var} à true/false
  • La valeur de l'attribut de condition else est définie sur property si la condition disponible était false, sans quoi la variable n'est pas définie. La valeur NotSet n'est pas identique à une valeur fausse explicite.
  • appeler n'importe quelle cible, mais si l'attribut if/less définit si elle est réellement exécutée

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.

1
Whome

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>