2012-02-11 71 views
3

我有一个ant任务在文件列表上执行一些命令。 我希望在连续构建时避免在成功传递命令并且没有改变的文件上重新运行命令。如何避免在未更改的源文件上运行ant任务?

例如:(这里的命令是xmllint

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

    </apply> 
</target> 

的问题是,即使xmlint失败的文件被认为是修改,因此xmllint不会对他们在连续构建重新运行。显然,这不是理想的行为。

两个备注:

  1. 我要寻找一个通用的解决方案,而不是只为xmllint的解决方案。
  2. 我想完全解决ant中的问题,而不创建 外部脚本。

回答

3

该代码使用Groovy ANT task做到以下几点:

  • 实现自定义常规选择,选择基于一个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命令可能会成功,而另一个可能会失败。
  • 创建一个名为“校验和”的子目录以存储MD5校验和文件。
  • Groovy的罐子从Maven Central

原来的答复

使用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” 将在创建的ANT下载构建目录。它记录文件摘要,用于确定自上次构建运行以来文件是否已更改。

+0

问题是即使任务失败,构建也不会重新运行该文件。我需要避免仅在已通过构建的文件上重新运行。 – viebel 2012-02-12 14:08:17

+0

这不是你问的。我唯一的建议是自定义选择器。除了文件摘要(用于表示文件更改)之外,还需要存储操作的结果。 – 2012-02-12 18:15:28

+0

我已更新了该问题以使其更清晰。 Thx – viebel 2012-02-12 22:03:46

相关问题