2

我认为这可能是一个例子最容易解释的,所以这里是:

<target name="test">
    <fileset id="fileset" dir="target">
        <include name="*"/>
    </fileset>
    <echo>${toString:fileset}</echo>
    <touch file="target/test"/>
    <echo>${toString:fileset}</echo>
</target>

输出:

test:
     [echo] 
    [touch] Creating target/test
     [echo] test

我理想地想要的是让文件集保持不变,这样我就可以有一个之前/之后的设置(为了使用 来获得一个改变的集合<difference>,所以如果你知道一种直接跳到那个的方法......)。

我尝试过使用<filelist>,但我无法在<difference>任务中正确填充和比较它(它们也很难调试,因为我似乎无法输出它们的内容)。我也尝试使用<modified/>来选择文件集中的文件,但它似乎根本不起作用,并且总是什么都不返回。

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

4

3 回答 3

2

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

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

于 2012-09-14T15:07:39.413 回答
2

路径选择器是动态评估的。添加文件后,在使用时会反映在集合中。

您可以使用pathconvert对其进行评估并将其保存在变量中。然后可以使用 pathtofilest 将其转换回filest

于 2012-09-15T04:45:45.853 回答
1

正如 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>
于 2012-09-18T08:42:51.693 回答