2009-02-06 11 views
145

Existe-t-il une tâche ANT qui exécuterait un bloc uniquement si un fichier existe? J'ai le problème que j'ai un script ant générique qui devrait faire un traitement spécial mais seulement si un fichier de configuration spécifique est présent.Impossible d'exécuter une cible Ant uniquement si un fichier existe?

+0

Voir aussi [Comment utilisez le joker dans la commande disponible Ant] (http://stackoverflow.com/questions/1073077/how-to-use-wildcard-in-ants-available-command/) – Vadzim

Répondre

192

Available 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> 
+8

Disponible est un nom non si évident pour ce qu'il fait. Je suis encore plus confus par le fait que google montre les gens qui écrivent leurs propres tags –

+2

ne semble pas fonctionner avec Ant 1.6.2. – djangofan

+0

Cela a bien fonctionné pour moi (Ant 1.8.2). Merci. –

115

Cela pourrait faire un peu plus de sens dans une perspective de codage (disponible avec ant-contrib: http://ant-contrib.sourceforge.net/):

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

Ceci est uniquement disponible dans ant-contrib je pense. –

+0

Parfait. Merci, Adam. –

+0

Je préfère nettement cette syntaxe –

25

Depuis Ant 1.8.0 il y a apparemment aussi resourceexists

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

Teste une ressource pour l'existance. 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> 

je suis à l'exemple retravailler de ce qui précède une bonne réponse à cette question, et je trouve cette

A partir de Ant 1.8.0, vous peut à la place utiliser l'extension de propriété ; une valeur true (ou sur ou oui) permettra à l'élément, tout faux (ou hors tension ou non) se le désactiver. Les autres valeurs sont toujours considérées comme et sont donc l'élément est activé uniquement si la propriété nommée est définie.

Par rapport à l'ancien style, ce vous donne une plus grande souplesse, parce que vous pouvez remplacer la condition de la ligne de commande ou d'un parent scripts:

<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 fourmi à http://ant.apache.org/manual/properties.html#if+unless

Espérons que cet exemple est utile à certains. Ils ne sont pas en utilisant resourceexists, mais on peut supposer que vous pourriez .....

+2

Notez que 'if = "$ {} File.Exists"' doit être remplacé par 'si = "File.Exists"' 'comme if' et' unless' vérifier que l'existence de la propriété par son nom, et non pas sa valeur. – Vadzim

+1

@Vadzim Comme la réponse mentionnée, cela ne fonctionne que dans Ant 1.8, et 1.8 supporte l'expansion des propriétés. http://ant.apache.org/manual/properties.html#if+unless –

10

Je pense que sa valeur faisant référence à cette même réponse: https://stackoverflow.com/a/5288804/64313

Voici une autre solution rapide. Il existe d'autres variantes possibles sur ce en utilisant la balise <available>:

# 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> 
0

Vous pouvez le faire en ordonnant de faire l'opération avec une liste de fichiers avec des noms correspondant au nom (s) dont vous avez besoin. C'est beaucoup plus facile et direct que de créer une cible spéciale. Et vous n'avez pas besoin d'outils supplémentaires, juste de la pure Ant.

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

http://ant.apache.org/manual/Types/fileset.html

2

Vérifiez L'utilisation de filtres de nom de fichier comme "DB _ */**/*. Sql"

Voici une variante pour effectuer une action si un ou plusieurs fichiers existent correspondant à un caractère générique filtre. Autrement dit, vous ne connaissez pas le nom exact du fichier.

Ici, nous recherchons des fichiers "* .sql" dans tous les sous-répertoires appelés "DB_ *", récursive. Vous pouvez ajuster le filtre à vos besoins.

NB: Apache Ant 1.7 et plus!

Voici la cible pour définir une propriété si les fichiers correspondants existent:

<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 « conditionnel » qui ne fonctionne que si les fichiers existent:

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