155 votes

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 ? J'ai le problème que j'ai un ant générique script qui devrait faire un traitement spécial mais seulement si un fichier de configuration spécifique est présent.

202voto

toolkit Points 27248

Disponible sur y 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 votes

Disponible est un nom peu évident pour ce qu'il fait. J'ai été encore plus confus par le fait que Google montre des personnes qui écrivent leurs propres tags.

0 votes

Cela peut fonctionner, mais ne semble pas être une bonne solution si vous devez appliquer à un grand nombre de fichiers

4 votes

Au cas où quelqu'un se demanderait, le if y unless Les attributs activent 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, il ne serait pas possible de dépendre d'une cible qui définit la propriété que vous vérifiez.

123voto

Adam Points 689

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>

36 votes

Ceci est seulement disponible dans ant-contrib je pense.

26voto

Jon Stafford Points 564

Depuis Ant 1.8.0, il y a apparemment aussi resourceexists

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

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

La ressource réelle à tester est spécifiée comme un é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, et puis j'ai trouvé ceci

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

Par rapport à l'ancien style, cela vous donne une flexibilité supplémentaire car vous pouvez passer outre la condition à partir de la ligne de commande ou des 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 la fourmi à http://ant.apache.org/manual/properties.html#if+, sauf si

J'espère que cet exemple sera utile à certains. Ils n'utilisent pas resourceexists, mais vous pourriez sans doute le faire. .....

2 votes

Notez que if="${file.exists}" doit être remplacé par if="file.exists" como if y unless vérifier uniquement l'existence d'une propriété par son nom, et non sa valeur.

1 votes

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

12voto

Casey Points 19286

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

Voici une autre solution rapide. Il y a d'autres variations possibles en utilisant l'option <available> étiquette :

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

0voto

Gangnus Points 7646

Vous pouvez le faire en demandant d'effectuer l'opération avec une liste de fichiers dont le nom est égal 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 pas besoin d'outils supplémentaires, juste du pur Ant.

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

Voir : FileSet .

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