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

Réponses:

200

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> 
boîte à outils
la source
8
Disponible est un nom peu évident pour ce qu'il fait. Je suis encore plus confus par le fait que google montre aux gens écrivant leurs propres tags
Mario Ortegón
cela peut fonctionner, mais ne semble pas être une bonne solution si vous devez appliquer à un grand nombre de fichiers
cmcginty
4
Au cas où quelqu'un se poserait la question, les attributs ifet unlessactivent ou désactivent uniquement la cible à laquelle ils sont attachés, c'est-à-dire que les dépendances de la cible sont toujours exécutées. Sinon, cela ne fonctionnerait pas de dépendre d'une cible qui définit la propriété que vous recherchez.
sschuberth
Il semble que ce <Available>soit obsolète. J'ai utilisé ceci: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> check: nant.sourceforge.net/release/0.85/help/functions/…
Loïc
1
@ Loïc 1: où dit-on que <available>c'est obsolète? 2: ${file::existst...} semble ne pas fonctionner avec Ant (Apache ANT 1.9.7)
user85421
123

Cela pourrait avoir un peu plus de sens 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>
Adam
la source
36
Ce n'est disponible que dans ant-contrib je pense.
Richard Cook
26

Depuis Ant 1.8.0, il existe apparemment aussi des ressources

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

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

Depuis Ant 1.8.0, vous pouvez à la place utiliser l'expansion des propriétés; 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 supposées être des noms de propriété et l'élément n'est donc activé que si la propriété nommée est définie.

Par rapport à l'ancien style, 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"/>

à partir du manuel ant à http://ant.apache.org/manual/properties.html#if+unless

Espérons que cet exemple sera utile à certains. Ils n'utilisent pas resourceexists, mais vous pourriez probablement? .....

Jon Stafford
la source
2
Notez que if="${file.exists}"devrait être remplacé par if="file.exists"as ifet unlessne vérifier que l'existence de la propriété par son nom, pas sa valeur.
Vadzim
1
@Vadzim Comme la réponse l'a mentionné, cela ne fonctionne que dans Ant 1.8, et 1.8 prend en charge l'expansion des propriétés. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky
12

Je pense que cela vaut la peine de faire référence à cette réponse similaire: https://stackoverflow.com/a/5288804/64313

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

# 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>
cmcginty
la source
3

Cochez Utiliser des 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. 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_ * ", de manière récursive. Vous pouvez ajuster le filtre selon vos besoins.

NB: Apache Ant 1.7 et supérieur!

Voici la cible pour définir une propriété si des 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 "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>
David Robson
la source
0

Vous pouvez le faire en ordonnant de faire l'opération avec une liste de fichiers avec des noms égaux au (x) 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 besoin d'aucun outil supplémentaire, juste de pure Ant.

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

Voir: FileSet .

Gangnus
la source