私は 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 を呼び出すには、これをどのように記述すればよいでしょうか? これが追加のソフトウェアなしで可能になるとうれしいです。例を教えてください。
最初の解決策では、アリの行動に違いはありません。
<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>
ここで何が問題なのですか?