如何避免在未更改的源文件上运行ant任务?

时间:2012-02-11 20:49:42

标签: ant

我有一个ant任务,可以在文件列表上执行一些命令。 我希望,在连续构建时,避免在已成功通过命令且未更改的文件上重新运行命令。

例如:(此处命令为xmllint

 <target name="xmllint-files">
    <apply executable="xmllint">
        <srcfile/>
        <fileset dir="." includes="*.xml">
            <modified/>
        </fileset>

    </apply>
</target>

问题是即使xmlint失败的文件也被视为已修改,因此xmllint将不会在连续版本上重新运行xmllint。显然,这不是理想的行为。

两个评论:

  1. 我正在寻找一般解决方案,而不仅仅是ant的解决方案。
  2. 我想在{{1}}内完全解决问题而不创建 外部脚本。

1 个答案:

答案 0 :(得分:3)

此代码使用Groovy ANT task执行以下操作:

  • 实现自定义groovy选择器,根据MD5校验和检查选择要处理的XML文件。
  • 在每个文件上调用 xmllint 并在成功完成后存储它的校验和(这可以防止重新执行 xmllint ,除非文件的内容发生更改。

示例:

<project name="demo" default="xmllint">

    <!--
    ======================
    Groovy task dependency
    ======================
    -->
    <path id="build.path">
        <pathelement location="jars/groovy-all-1.8.6.jar"/>
    </path>
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

    <!--
    ==============================================
    Select files to be processed 
    MD5 checksums located in "checksums" directory
    ==============================================
    -->
    <target name="select-files">
        <fileset id="unprocessedfiles" dir=".">
            <include name="*.xml"/>
            <exclude name="build.xml"/>
            <scriptselector language="groovy" classpathref="build.path">
                def ant = new AntBuilder()
                ant.checksum(file:filename, toDir:"checksums", verifyProperty:"isMD5ok")

                self.selected = (ant.project.properties.isMD5ok == "false") ? true : false
            </scriptselector>
        </fileset>
    </target>

    <!--
    =============================================================
    Process each file 
    Checksum is saved upon command success, prevents reprocessing
    =============================================================
    -->
    <target name="xmllint" depends="select-files">
        <groovy>
            project.references.unprocessedfiles.each { file ->
                ant.exec(executable:"xmllint", resultproperty:"cmdExit") {
                    arg(value:file)
                }
                if (properties.cmdExit == "0") {
                    ant.checksum(file:file.toString(), toDir:"checksums")
                }
            }
        </groovy>
    </target>

</project>

注意

  • 使用原始应用 ANT任务无法实现此复杂要求。对 xmllint 命令的一次调用可能会成功,而另一次可能会失败。
  • 创建一个名为“checksums”的子目录来存储MD5校验和文件。
  • 可以从Maven Central
  • 下载groovy jar

原始答案

使用ANT modified selector

<project name="demo" default="xmllint">

    <target name="xmllint">
        <apply executable="xmllint">
            <srcfile/>
            <fileset dir="." includes="*.xml">
                <modified/>
            </fileset>
        </apply>
    </target>

</project>

将在构建目录中创建名为“cache.properties”的属性文件。它记录文件摘要,用于确定自上次构建运行以来文件是否已更改。