2014-04-18 13 views
1

我運行一個腳本,該腳本根據定義文件生成一些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

這是一個很好的用例爲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任務刪除所有如果其中任何比任何源文件的較舊的目標文件,所以我們可以do.generate條件 - 如果有在generatedFolder沒有文件就會運行,這種情況在以前從未運行過,或者生成的文件已過期。

相關問題