2012-07-22 59 views
1

我是新來的ant,而不是用於Makefiles。在一個項目中,名爲Message_zh.class等的i18n語言模塊是由zh.po等無條件編譯的,雖然它們已經存在,但浪費了很多時間。我想這些都是build.xml文件的相關部分:ant-uptodate任務:只重新生成過時的文件

<target id="msgfmt" name="msgfmt"> 
    <mkdir dir="po/classes" /> 
    <propertyregex property="filename" 
       input="${file}" 
       regexp="[.]*/po/([^\.]*)\.po" 
       select="\1" 
       casesensitive="false" /> 
    <exec dir="." executable="msgfmt"> 
     <arg line="--java2 -d po/classes -r app.i18n.Messages -l ${filename} po/${filename}.po"/> 
    </exec> 
</target> 

<target id="build-languageclasses" name="build-languageclasses" > 
    <echo message="Compiling po files." /> 
    <foreach target="msgfmt" param="file"> 
     <path> 
     <fileset dir="po" casesensitive="yes"> 
      <include name="**/*.po"/> 
     </fileset> 
     </path> 
    </foreach> 
</target> 

目標集結languageclasses在編譯目標取決於等等,每一個彙總,一大堆再次msgfmted。只有在1. po文件被更改或者2.類文件不存在的情況下,應如何寫入以調用msgfmt?如果沒有其他軟件,這將是可能的,我會很高興。你能幫忙或者指點我一個例子嗎?

在溶液中的第一次嘗試,使螞蟻的行爲沒有什麼區別:

<target id="build-languageclasses" description="compile if Messages??.class files not uptodate" name="build-languageclasses" unless="i18n.uptodate"> 
    <condition property="i18n.uptodate"> 
    <uptodate> 
     <srcfiles dir="${po}" includes="**/*.po"/> 
     <mapper type="glob" from="${po}/*.po" to="${po}/classes/app/i18n/Messages*.class"/> 
    </uptodate> 
    </condition> 
    <echo message="Compiling po files." /> 
    <foreach target="msgfmt" param="file"> 
    <path> 
     <fileset dir="po" casesensitive="yes"> 
     <include name="**/*.po"/> 
     </fileset> 
    </path> 
    </foreach> 
</target> 

什麼錯在這裏的?

回答

1

問題是,在運行uptodate任務之前,您正在測試屬性i18n.uptodate。在您輸入build-languageclasses目標之前,您的條件塊必須運行。

你應該重新組織你的代碼,這樣的:

  • 的主要目標
  • 刪除unless="i18n.uptodate"分裂build-languageclasses爲2的目標。
  • 第一個是專門用於初始化您的條件並僅包含<condition>塊。
  • 第二包含代碼,以生成將文件(<foreach>

第二靶被配置爲有條件地運行根據由第一目標設置屬性i18n.uptodate

編輯 - 這裏是UPTODATE任務

<property name="source" value="${basedir}/src"/> 
<property name="dist" value="${basedir}/dist"/> 

<target name="init"> 
    <condition property="that.uptodate"> 
     <uptodate> 
      <srcfiles dir="${source}" includes="*.txt"/> 
      <mapper type="glob" from="*.txt" to="${dist}/*.bat"/> 
     </uptodate> 
    </condition> 
</target> 

<target description="check that" name="dist" unless="that.uptodate" depends="init"> 
    <echo>we have something to do!</echo> 
</target> 

HIH M.

+0

謝謝。我接受,因爲你的答案包含解決問題的必要步驟。但是,我仍然有問題才能使其正常工作。 ant -verbose現在在uptodate塊中說:[uptodate](path)/po/ar.po跳過 - 不知道如何處理它。爲什麼只有在檢查時才能處理? – rwst 2012-07-24 08:07:00

+0

我沒有。你能發佈代碼嗎?當你有這個消息時,ar.po文件是否升級或不同步? – poussma 2012-07-24 09:14:40

+0

Messages_ar.class取決於ar.po,但是是最新的。 – rwst 2012-07-24 11:10:46

相關問題