您好我不太确定如何标题这个问题,但我会解释为什么我要这么做。
首先,我有一个包含特定格式的SQL脚本的文件夹,它是updateXtoY.sql,其中X和Y是整数。我需要知道哪个Y是最高的数字。 (基本上,要知道哪个是最新的脚本)
所以如果我的文件夹中有“scripts /”3个文件:
update3to5.sql
update2to5.sql
update1to6.sql
我需要的结果是为属性'latest.version'赋值6。
从那时起,我可以轻松运行脚本。所以我遇到的问题是3倍:
1-如何将文件名加载到数据结构中。
2-如何迭代数据结构。
3-如何评估每个文件名,以便我可以提取文件的“Y”部分并获得最高值。 (我正在读正则表达式)
我是ANT的新手,我不确定这是否可行和/或可行。
感谢您的任何建议。
答案 0 :(得分:5)
任务的第一部分 - 将文件名转换为'结构'最好使用FileSet - 比如说 scripts 目录中的SQL脚本:
<fileset dir="scripts" includes="*.sql" id="versions" />
这会创建一个可以使用ID versions
引用的Ant resource collection。
该集合了解您的SQL脚本文件。
使用(如你所建议的)正则表达式映射器,我们可以将文件集转换为字符串集合,只保存文件名中的版本部分:
<mappedresources id="versions">
<fileset dir="scripts" includes="*.sql" />
<regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
在此示例中,versions
现在拥有一个“列表”,您的示例文件为"5,5,6"
。
现在变得更加棘手,因为你可能需要对什么是字符串列表进行数字排序 - 以避免10次排序为“少于”9.Ant带有嵌入式Javascript解释器,所以你可以使用它找到最大值。另一种选择是利用ant-contrib必须提供的数字排序功能。
这是一个Javascript'max finder':
<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.