ant校验和目录不反映已删除的文件

时间:2013-08-12 10:43:37

标签: ant checksum

我定义了以下ant目标。如果文件夹的某些内容发生了变化,那么这个想法只是做繁重的工作。

<target name="checksumAssets">
    <echo message="verify checksums" />

    <checksum todir="${bin.loc}/../checksums"  verifyproperty="checksum.isUpToDate.test">
        <fileset dir="${bin.loc}/assets/" id="filelist">
            <include name="somefolder/" />
            <exclude name="somefolder/result.swf"/>
        </fileset>
    </checksum>
    <echo message="${toString:filelist}"/>
    <echoproperties regex="checksum.isUpToDate.test"/>
</target>

<target name="createAsset" depends="checksumAssets" unless="${checksum.isUpToDate.test}">

    <!-- do create the assets and other magic -->

    <echo message="create checksum files" />
    <checksum todir="${bin.loc}/../checksums" >
        <fileset refid="filelist" />
    </checksum>
</target>

somefolder包含将被处理的图像,并生成包含这些资产的swf文件。

我希望只有在资产文件夹中的某些内容发生变化时才能进行这种繁重的处理。

这在两种情况下起作用:

  • 我向somefolder添加了一个新文件
  • 我更改了某些文件夹中的现有文件

我的问题是:

  • 当我从此文件夹中删除文件时,它不起作用。

这意味着,如果我从相关文件夹中删除文件,则不会在ant createAsset上调用createAsset目标。在上述两种情况下调用它,如果校验和文件夹中没有校验和文件。

有什么我错过的吗?

ant版本是1.8.2

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。

由于<checksum>仅保存单个文件的校验和,因此无法知道先前运行中是否缺少文件。为此,它需要将完整文件列表的校验和保存在磁盘上。

这就是我所做的:

<target name="checksumAssets">
    <echo message="verify checksums" />

    <!-- generate filelist.txt with actual content of somefolder -->
    <fileset dir="${bin.loc}/assets/somefolder/" id="filelist">
        <exclude name="result.swf"/>
        <exclude name="filelist.txt"/>
    </fileset>
    <concat destfile="${bin.loc}/assets/somefolder/filelist.txt" fixlastline="true">${toString:filelist}</concat>

    <!-- checksum folder including the filelist.txt -->
    <checksum todir="${bin.loc}/../checksums"  verifyproperty="checksum.isUpToDate.test">
        <fileset dir="${bin.loc}/assets/" id="checkedlist">
            <include name="somefolder/" />
            <exclude name="somefolder/result.swf"/>
        </fileset>
    </checksum>
</target>

<target name="createAsset" depends="checksumAssets" unless="${checksum.isUpToDate.test}">

    <!-- do create the assets and other magic -->

    <echo message="create checksum files" />
    <checksum todir="${bin.loc}/../checksums" >
        <fileset refid="checkedlist" />
    </checksum>
</target>
  • 首先我生成一个filelist.txt,其中包含当前文件夹的内容。
  • 然后我生成此文件夹中所有文件的校验和,包括filelist.txt

在每次运行时,将生成filelist.txt并根据上次成功运行createAsset的filelist.txt进行检查。

现在,如果内容文件发生更改或此文件夹的内容发生更改,则会运行createAsset目标。

任务完成;)