9

这对我来说听起来有点牵强,但是是否有一个 ANT 任务来监视目录的更改,然后在目录更改时运行特定的 ANT 类?

4

4 回答 4

5

如果文件只能添加到监视目录或在监视目录中更改,那么您可以使用 antcontrib 中的这个简单的OutOfDate任务。

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

如果文件可以从watched-dir中消失,那么你有更复杂的问题,你可以通过创建watched dir的shadow目录结构并检查它是否与watched-dir一致来解决。这个任务更复杂,但我会给你一个脚本来创建一个影子目录,因为它不是直截了当的:

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

创建影子目录后,我将检查目录一致性的任务留给读者作为练习。

于 2010-08-26T00:28:35.530 回答
4

是的,有一个 Ant Task 可以做到这一点:

https://github.com/chubbard/WatchTask

它需要1.7+。它可以监视任意数量的文件集,并根据它来自哪个文件集调用任何目标。

于 2014-03-05T02:14:07.080 回答
1

您也许可以使用该Waitfor任务来实现您想要的。它会阻塞直到一个或多个条件(例如特定文件的存在)变为真。

于 2010-08-25T22:14:49.143 回答
0

您可以将应用任务与文件集选择器结合起来

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

文件集将根据存储的 MD5 校验和检查文件是否有更改。您需要将 ANT 放入循环中才能重复运行此检查。这在 Unix 中很容易做到:

while true
> do
> ant
> sleep 300
> done
于 2010-08-26T21:26:31.430 回答