web-dev-qa-db-fra.com

Tâche Ant pour exécuter une cible Ant uniquement si un fichier existe?

Existe-t-il une tâche ANT qui exécuterait un bloc uniquement si un fichier donné existe? Le problème est que j'ai un script Ant générique qui doit faire l'objet d'un traitement spécial, mais uniquement si un fichier de configuration spécifique est présent.

150
Mario Ortegón

Disponible et Condition

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
199
toolkit

Cela pourrait sembler un peu plus logique du point de vue du codage (disponible avec ant-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
120
Adam

Depuis Ant 1.8.0, il y a apparemment aussi des ressources

De http://ant.Apache.org/manual/Tasks/conditions.html

Teste l'existence d'une ressource. depuis Ant 1.8.0

La ressource réelle à tester est spécifiée en tant qu'élément imbriqué.

Un exemple:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

J'étais sur le point de retravailler l'exemple de la bonne réponse ci-dessus à cette question, puis j'ai trouvé ceci

À partir de Ant 1.8.0, vous pouvez plutôt utiliser l'extension de propriété; une valeur true (ou on ou yes) activera l'élément, tandis que false (ou off ou no) le désactivera. Les autres valeurs sont toujours considérées comme des noms de propriétés et l'élément n'est activé que si la propriété nommée est définie.

Par rapport au style plus ancien, cela vous donne une flexibilité supplémentaire, car vous pouvez remplacer la condition à partir de la ligne de commande ou des scripts parents:

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

du manuel de fourmi à l’adresse http://ant.Apache.org/manual/properties.html#if+unless

J'espère que cet exemple est utile à certains. Ils n'utilisent pas resourceexists, mais probablement que vous pourriez? .....

26
Jon Stafford

Je pense que sa mérite de référencer cette réponse similaire: https://stackoverflow.com/a/5288804/6431

Voici une autre solution rapide. Il y a d'autres variations possibles à ce sujet en utilisant le <available> tag:

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>
12
cmcginty

Vérifiez à l'aide de filtres de nom de fichier comme DB_*/**/*.sql

Voici une variante pour effectuer une action s'il existe un ou plusieurs fichiers correspondant à un filtre générique. C'est-à-dire que vous ne connaissez pas le nom exact du fichier.

Ici, nous recherchons des fichiers "*. Sql" dans tous les sous-répertoires nommés "DB _ *", de manière récursive. Vous pouvez adapter le filtre à vos besoins.

NB: Apache Ant 1.7 et supérieur!

Voici la cible pour définir une propriété s'il existe des fichiers correspondants:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

Voici une cible "conditionnelle" qui ne s'exécute que si des fichiers existent:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>
2
David Robson

Vous pouvez le faire en ordonnant de faire l'opération avec une liste de fichiers dont le nom correspond au (x) nom (s) requis. Il est beaucoup plus facile et direct que de créer une cible spéciale. Et vous n'avez pas besoin d'outils supplémentaires, mais simplement de Ant.

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

Voir: FileSet .

0
Gangnus