如果定义已更改ant,则仅生成源文件

时间:2014-04-18 11:57:48

标签: java ant

我运行一个脚本,根据定义文件生成一些java代码。如果定义文件没有更改,我想避免运行此任务。

<target name="generate" depends="init">
<exec executable="${codeGenTool-path}">
  <arg value="${definitionFolder}" />
  <arg value="${generatedFolder}" />
</exec>
</target>

我看了http://ant.apache.org/manual/Tasks/uptodate.html但似乎我必须有一个目标文件来比较。代码生成工具创建一个包含许多源文件的文件夹。

1 个答案:

答案 0 :(得分:1)

这是来自outofdate taskant-contrib的一个很好的用例:

<outofdate>
  <sourcefiles>
    <fileset dir="${definitionFolder}" />
  </sourcefiles>
  <targetfiles>
    <fileset dir="${generatedFolder}" />
  </targetfiles>
  <sequential>
    <exec executable="${codeGenTool-path}">
      <arg value="${definitionFolder}" />
      <arg value="${generatedFolder}" />
    </exec>
  </sequential>
</outofdate>

这将针对definitionFolder下的每个文件检查generatedFolder下的每个文件 - 您可能希望更严格地约束文件集,例如使用includes="**/*.def"或任何相关的文件扩展名。

或者,如果您想避免“第三方”任务,那么您可以使用dependset任务来检查源文件的目标文件。

<target name="generate" depends="check.generate, do.generate" />

<target name="check.generate">
  <dependset>
    <srcfileset dir="${definitionFolder}" />
    <targetfileset dir="${generatedFolder}" />
  </dependset>

  <condition property="gen.required">
    <resourcecount count="0" when="equal">
      <fileset dir="${generatedFolder}" />
    </resourcecount>
  </condition>
</target>

<target name="do.generate" if="gen.required">
  <exec ....>
</target>

dependset任务删除所有目标文件,如果任何比任何源文件旧,那么我们可以{{1} }条件 - 如果do.generate中没有文件,它将会运行,如果之前从未运行过,或生成的文件已过期,则会运行。