Есть ли задача ANT для просмотра каталога на предмет изменений? - PullRequest
9 голосов
/ 26 августа 2010

Это звучит немного странно для меня, но есть ли задача ANT для просмотра каталога на предмет изменений и затем запуска определенного класса ANT при изменении каталога?

Ответы [ 4 ]

5 голосов
/ 26 августа 2010

Если файлы могут быть добавлены или изменены только в наблюдаемом каталоге, вы можете использовать эту простую задачу OutOfDate из 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>

Если файлы могут исчезнуть из наблюдаемого каталога, у вас есть более сложная проблема, которую вы можете решить, создав теневую структуру каталогов наблюдаемого каталога и проверив, соответствует ли она наблюдаемому каталогу. Это более сложное задание, но я дам вам сценарий для создания теневого каталога, поскольку он не прост:

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

С созданием теневого каталога я оставлю задачу проверки согласованности каталогов в качестве упражнения для читателя.

4 голосов
/ 05 марта 2014

Да, есть задача Ant, которая сделает это:

https://github.com/chubbard/WatchTask

Требуется 1,7+.Он может просматривать любое количество наборов файлов и вызывать любую цель в зависимости от того, из какого набора файлов он поступил.

1 голос
/ 26 августа 2010

Вы можете использовать задачу <a href="http://ant.apache.org/manual/Tasks/waitfor.html" rel="nofollow noreferrer">Waitfor</a> для достижения того, что вы хотите. Блокируется до тех пор, пока одно или несколько условий (например, наличие определенного файла) не станут истинными.

0 голосов
/ 27 августа 2010

Вы можете объединить задачу apply с селектором набора файлов

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

Набор файлов будет проверять файлы по сохраненной контрольной сумме MD5 на наличие изменений. Вам нужно будет поместить ANT в цикл, чтобы повторно запустить эту проверку. это легко сделать в Unix:

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