任务的第一部分 - 获取文件名成“结构”是最好的使用做了FileSet - 在一个名为脚本目录执行的话SQL脚本:
<fileset dir="scripts" includes="*.sql" id="versions" />
这就产生了一个Ant resource collection可以使用编号versions
来引用。 集合知道你的SQL脚本文件。
使用(你的建议)一个正则表达式映射器,我们可以将一组文件转换成字符串的集合,从文件名只持有版本部分:
<mappedresources id="versions">
<fileset dir="scripts" includes="*.sql" />
<regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
在这个例子中versions
现在持有'list',这将是您的示例文件的"5,5,6"
。
它现在变得更加棘手,因为您可能需要对什么是字符串列表进行数字排序 - 以避免10比“9”排序更少。Ant带有嵌入的Javascript解释器,因此您可以使用那要找到最大值。另一种选择是利用ant-contrib必须提供的数字排序功能。
这里是一个Javascript“最大的取景器:
<scriptdef name="numeric_max" language="javascript">
<attribute name="property" />
<attribute name="resources_id" />
<![CDATA[
var iter = project.getReference(
attributes.get("resources_id")
).iterator();
var max_n = 0.0;
while (iter.hasNext())
{
var n = parseFloat(iter.next());
if (n > max_n) max_n = n;
}
project.setProperty(attributes.get("property"), max_n);
]]>
</scriptdef>
定义一个新的Ant XML实体 - numeric_max
- 看起来像一个任务,可用于查找字符串集合的最大数字。 这并不完美 - 没有验证字符串,我使用了浮点数而不是整数。
相结合,与mappedresources
以上:
<mappedresources id="versions">
<fileset dir="scripts" includes="*.sql" />
<regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
<numeric_max property="latest.version" resources_id="versions" />
<echo message="Latest SQL script version: ${latest.version}." />
当我运行与您的三个文件,我得到:
[echo] Latest SQL script version: 6.
您可以重命名文件,使相应的电话号码在前面F.E. updateTo6from1.sql你可以简单地按文件名进行排序并完成这个问题? – Yashima
好吧,所有这些都必须从ANT自动完成,所以我不确定一旦文件名被加载到结构中,如果我可以保证最新的将是第一个元素。 – Endo
自从我使用Ant以来已经有一段时间了。您始终可以在java中将其作为AntTask实现并使用您自己的任务。通常您可能会使用FileSet来加载文件,但排序文件集似乎并不重要。 – Yashima