我是 ant 新手,习惯于 Makefile。在一个项目中,名为 Message_zh.class 等的 i18n 语言模块是在每次编译时从 zh.po 等无条件构建的,尽管它们已经存在,这会浪费很多时间。我认为这些是 build.xml 的相关部分:
<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>
目标 build-languageclasses 依赖于编译目标,因此,每次编译,整个一堆都再次被 msgfmted。仅当 1. po 文件已更改或 2. 类文件不存在时,应如何编写以调用 msgfmt?如果没有其他软件也能做到这一点,我会很高兴。你能帮我举个例子吗?
解决方案的第一次尝试对 ant 的行为没有影响:
<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>
这里有什么问题?