1

我是 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> 

这里有什么问题?

4

2 回答 2

1

问题是您i18n.uptodate在运行uptodate任务之前正在测试该属性。您的条件块必须在您输入build-languageclasses目标之前运行。

您应该像这样重新组织您的代码:

  • 删除unless="i18n.uptodate"主要目标上的
  • 分成build-languageclasses2个目标。
  • 第一个专用于您的条件的初始化,并且<condition>仅包含块。
  • 第二个包含生成文件的代码(<foreach>

第二个目标被配置为根据i18n.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>

嗨,M。

于 2012-07-23T16:27:50.410 回答
0

尝试使用 ant-contrib - OutOfDate - 如果您想要第一封邮件中的第二个来源中的结构 http://ant-contrib.sourceforge.net/tasks/tasks/outofdate.html

于 2012-12-31T14:17:48.930 回答