gpt4 book ai didi

java - ant - 更新任务 : regenerate only outdated files

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:52 25 4
gpt4 key购买 nike

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

目标构建语言类依赖于编译目标,因此每次编译时,都会再次对整个集合进行 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>

这里出了什么问题?

最佳答案

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

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

  • 删除 unless="i18n.uptodate"围绕主要目标
  • 拆分 build-languageclasses分成2个目标。
  • 第一个专门用于初始化您的条件并包含 <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>

嗨米。

关于java - ant - 更新任务 : regenerate only outdated files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com