gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:58:56 25 4
gpt4 key购买 nike

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

例如:(这里的命令是xmllint)

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

</apply>
</target>

问题是,即使 xmlint 失败的文件也被视为已修改,因此 xmllint 不会在连续构建时对它们重新运行。显然,这不是期望的行为。

两点说明:

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

最佳答案

此代码使用 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>

注意:

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

原始答案

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

关于ant - 如何避免在未更改的源文件上运行 ant 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com