我定义了以下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文件。
我希望只有在资产文件夹中的某些内容发生变化时才能进行这种繁重的处理。
这意味着,如果我从相关文件夹中删除文件,则不会在ant createAsset
上调用createAsset目标。在上述两种情况下调用它,如果校验和文件夹中没有校验和文件。
有什么我错过的吗?
ant版本是1.8.2
答案 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并根据上次成功运行createAsset
的filelist.txt进行检查。
现在,如果内容文件发生更改或此文件夹的内容发生更改,则会运行createAsset
目标。
任务完成;)