为什么ANT会在文件集创建后更新其内容,我可以覆盖它吗?

为什么ANT会在文件集创建后更新其内容,我可以覆盖它吗?,ant,fileset,Ant,Fileset,我认为用一个例子来解释这一点可能最简单,因此: <target name="test"> <fileset id="fileset" dir="target"> <include name="*"/> </fileset> <echo>${toString:fileset}</echo> <touch file="target/test"/> <ech

我认为用一个例子来解释这一点可能最简单,因此:

<target name="test">
    <fileset id="fileset" dir="target">
        <include name="*"/>
    </fileset>
    <echo>${toString:fileset}</echo>
    <touch file="target/test"/>
    <echo>${toString:fileset}</echo>
</target>
理想情况下,我希望文件集保持不变,这样我就可以有一个before/after集(以便使用
获得一个更改的集,如果您知道一种方法可以直接跳到该集…)

我尝试使用
来代替,但我无法在
任务中正确填充和比较这些内容(它们也很难调试,因为我似乎无法输出它们的内容)。我还尝试使用
选择文件集中的文件,但它似乎根本不起作用,而且总是不返回任何内容


即使有另一种方法,我也希望能够更好地理解ANT在上面的示例中所做的事情以及原因。

文件集类似于选择器。它是一组“指令”(包含、排除、模式),允许获取一组文件


每次您实际对文件集执行某些操作(例如打印它“引用”的文件)时,实际的文件集将根据文件集中包含的“指令”进行计算。

路径选择器将动态计算。添加文件后,当您使用它时,它将反映在集合中


您可以使用来评估它并将其保持在变量中。然后可以使用

将其转换回filest,正如Jayan指出的那样,将最终结果作为答案发布可能是值得的,因此这里有一个简化版本,其中包含关键部分:

<fileset id="files" dir="${target.dir}"/>
<pathconvert property="before.files" pathsep=",">
    <fileset refid="files"/>
</pathconvert>
<!-- Other Ant code changes the file-system. -->
<pathconvert property="after.files" pathsep=",">
    <fileset refid="files"/>
</pathconvert>
<filelist id="before.files" files="${before.files}"/>
<filelist id="after.files" files="${after.files}"/>
<difference id="changed.files">
    <filelist refid="before.files"/>
    <filelist refid="after.files"/>
</difference>

将其转换回文件集对于我来说是无用的,但由于pathconvert将其存储为字符串属性,因此可以很容易地创建文件列表,然后在
任务中使用。谢谢
<fileset id="files" dir="${target.dir}"/>
<pathconvert property="before.files" pathsep=",">
    <fileset refid="files"/>
</pathconvert>
<!-- Other Ant code changes the file-system. -->
<pathconvert property="after.files" pathsep=",">
    <fileset refid="files"/>
</pathconvert>
<filelist id="before.files" files="${before.files}"/>
<filelist id="after.files" files="${after.files}"/>
<difference id="changed.files">
    <filelist refid="before.files"/>
    <filelist refid="after.files"/>
</difference>