75 votes

Existe-t-il un moyen de vérifier l'existence d'un répertoire dans Ant (et non d'un fichier) ?

Comment vérifier l'existence d'un dossier à l'aide de Ant ?

Nous pouvons vérifier l'existence d'un fichier, mais pouvons-nous faire de même pour un dossier ?

105voto

Rich Seller Points 46052

Vous utilisez le disponible sur tâche dont le type est "dir".

Par exemple :

<available file="${dir}" type="dir"/>

La manière standard d'effectuer un traitement conditionnel est d'utiliser la fonction tâche conditionnelle . Dans l'exemple ci-dessous, l'exécution de doFoo renverra un message si le répertoire existe, tandis que l'exécution de doBar renverra un message sauf si le répertoire existe.

El dir.check est requise par doFoo et doBar, elle définit la cible dir.existe à true ou 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 à true et doBar ne s'exécutera que si elle n'est pas définie ou définie à 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>

Antilope fournit des tâches supplémentaires, y compris une tâche If qui peut rendre le traitement plus simple (et pour moi, plus intuitif), vous pouvez télécharger les tâches Antelope à partir de la page page de téléchargement .

2 votes

Mais cela va mettre la valeur d'une propriété à true. Alors comment dois-je vérifier la condition. Je veux dire n'importe quel "si" ?

0 votes

Pourquoi la vérification dir.check est après doFoo et doBar ? Cela ne devrait-il pas être l'inverse ? @Rich Seller

0 votes

@MiguelOrtiz l'ordre de déclaration n'a pas d'importance, l'exécution ne dépend que de l'ordre de la déclaration. depends attributs. Je pense qu'il est plus propre de mettre pour ainsi dire les cibles "publiques" en haut, et les cibles "privées" en bas.

33voto

Dan J Points 7314

Voici un petit exemple incorporant le available en un élément if test.

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

Avertissement vous avez besoin de ant-contrib.jar dans votre ANT_HOME \lib sinon vous n'aurez pas accès au répertoire if et votre script échouera avec cette erreur :

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.

2 votes

J'aime la simplicité et l'expressivité de cette solution. Cela valait la peine de faire des efforts supplémentaires pour installer ant-contrib.jar.

9voto

bcody Points 693

Voici ma solution, qui ne nécessite pas de définir des propriétés et d'utiliser des cibles avec "si" ou "à moins que" :

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>

Utilisation :

<assertDirAvailable dir="${dirToCheck}" />

0 votes

Joli ! Evite ant-contrib.jar ce qui est une bonne chose. Il reste déclaratif plutôt que procédural.

0 votes

Correction cependant : ce devrait être ${artifactDir} et non @{artifactDir}.

0 votes

J'ai copié cet exemple d'utilisation à partir d'un script de ma construction réelle où artifactDir était un attribut dans un macrodef. J'ai changé l'exemple d'utilisation pour le cas peut-être plus commun de passer un paramètre plutôt qu'un attribut macrodef. Merci !

1voto

Whome Points 2303

Ma solution utilise la version ANT 1.8, les versions plus anciennes peuvent ne pas fonctionner car elles ne supportent pas la syntaxe ${evalTrueOrFalse}.

<?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>
  • Si ANT 1.6 ou ANT 1.7 ne fonctionne pas, passez à la version ANT 1.8.

  • Attributs de la cible si y sauf si évalue la syntaxe ${var} à true/false

  • Attribut de la condition sinon La valeur est fixée à la propriété si la condition disponible est fausse, sinon la variable n'est pas fixée. La valeur NotSet n'est pas la même qu'une valeur explicitement fausse.

  • appelle n'importe quelle cible mais l'attribut if/unless définit si elle est réellement exécutée

http://ant.apache.org/manual/properties.html#if+, sauf si
[If/Unless] Dans Ant 1.7.1 et antérieur, ces attributs ne pouvaient être que des noms de propriétés. A partir de Ant 1.8.0, vous pouvez utiliser l'expansion de propriété. Par rapport à l'ancien style, cela vous donne une flexibilité supplémentaire.

2 votes

5+ ans plus tard, je pense que doCustomize aurait dû être doMagic.

0voto

Voici une autre approche, qui 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X