2010-08-25 16 views
9

Cela me semble un peu tiré par les cheveux, mais y a-t-il une tâche ANT pour regarder un répertoire pour les changements et exécuter une classe ANT particulière quand le répertoire change?Y at-il une tâche ANT pour regarder un répertoire pour les changements?

+0

Eh bien, je n'ai pas trouvé de solution simple à ceci donc j'utilise pour l'instant une commande spécifique à bash: 'inoticoming --foreground ./src/anti \;' – leeand00

Répondre

5

Si des fichiers peuvent uniquement être ajoutés ou modifiés dans le répertoire surveillé, vous pouvez utiliser cette tâche OutOfDate depuis antcontrib.

<property name="watched-dir.flagfile" 
    location="MUST be not in watched dir"/> 
<outofdate> 
    <sourcefiles> 
    <fileset dir="watched-dir"/> 
    </sourcefiles> 
    <targetfiles> 
    <pathelement location="${watched-dir.flagfile}"/>   
    </targetfiles> 
    <sequential> 

    <!--Tasks when something changes go here--> 

    <touch file="${watched-dir.flagfile}"/> 
    </sequential> 
</outofdate> 

Si les fichiers peuvent disparaître de la dir regardé, alors vous avez un problème plus complexe, que vous pouvez résoudre en créant la structure de répertoire d'ombre du répertoire regardé et vérifier si son compatible avec le dir observé. Cette tâche est plus complexe, mais je vais vous donner un script pour créer un répertoire d'ombre, comme il est simple:

<property name="TALK" value="true"/> 
<property name="shadow-dir" 
    location="MUST be not in watched dir"/> 

<touch 
    mkdirs="true" 
    verbose="${TALK}" 
> 
    <fileset dir="watched-dir"> 
    <patterns/> 
    <type type="file"/> 
    </fileset> 

    <!-- That's the tricky globmapper to make touch task work --> 
    <globmapper from="*" to="${shadow-dir}/*"/> 
</touch> 

<!-- 
    Due to how touch task with mapped fileset is implemented, it 
    truncates file access times down to a milliseconds, so if you 
    would have used outofdate task on shadow dir it would always 
    show that something is out of date. 

    Because of that, touching all files in ${shadow-dir} again fixes 
    that chicken and egg problem. 
--> 
<touch verbose="${TALK}"> 
    <fileset dir="${shadow-dir}"/> 
</touch> 

Avec répertoire ombre créée, je vais laisser la tâche de vérifier la cohérence de répertoire un exercice pour le lecteur.

+3

Peu importe si le répertoire cible contient des fichiers plus anciens que le répertoire source. Je veux une tâche ant qui regardera le répertoire et quand je sauve les changements dans le dossier dans l'éditeur, il appellera une tâche particulière de fourmi. – leeand00

1

Vous pouvez utiliser la tâche Waitfor pour obtenir ce que vous voulez. Il bloque jusqu'à ce qu'une ou plusieurs conditions (telles que la présence d'un fichier particulier) deviennent vraies.

+0

Cette tâche de fourmi permet d'interroger. N'y a-t-il pas un moyen de faire en sorte que la tâche Ant s'abonne au répertoire pour les changements? – leeand00

+1

Que voulez-vous dire par "s'abonner"? Surveillez les événements du système de fichiers? – akr

0

Vous pouvez combiner la tâche avec un applyfileset selector

<apply executable="somecommand" parallel="false"> 
    <srcfile/> 
    <fileset dir="${watch.dir}"> 
    <modified/> 
    </fileset> 
</apply> 

L'ensemble de fichiers vérifie les fichiers contre une somme de contrôle MD5 stocké pour des changements. Vous devrez mettre ANT dans une boucle afin d'exécuter plusieurs fois cette vérification. c'est facile à faire dans Unix:

while true 
> do 
> ant 
> sleep 300 
> done 
3

Oui, il y a une tâche Ant qui le fera:

https://github.com/chubbard/WatchTask

Il faut 1.7+. Il peut regarder n'importe quel nombre de groupes de fichiers et invoquer n'importe quelle cible en fonction du groupe de fichiers dont il provient.

+0

N'a pas une licence ... :( –

+1

@JethroLarson maintenant il.Ajouté le même jour que votre commentaire, il semble. :) – kekkis

+0

n'a pas encore compris comment l'utiliser encore, ne sais pas où pour trouver le JAR leur référencement, pas assez de documentation. – Vadorequest