您好我不太确定如何标题这个问题,但我会解释为什么我要这么做.
首先,我有一个包含特定格式的SQL脚本的文件夹,它是updateXtoY.sql,其中X和Y是整数.我需要知道哪个Y是最高的数字.(基本上,要知道哪个是最新的脚本)
所以,如果我在我的文件夹"scripts /"3文件中:
update3to5.sql
update2to5.sql
update1to6.sql
Run Code Online (Sandbox Code Playgroud)
我需要的结果是为属性'latest.version'赋值6.
从那时起,我可以轻松运行脚本.所以我遇到的问题是3倍:
1-如何将文件名加载到数据结构中.
2-如何迭代数据结构.
3-如何评估每个文件名,以便我可以提取文件的"Y"部分并获得最高值.(我正在读正则表达式)
我是ANT的新手,我不确定这是否可行和/或可行.
谢谢你的任何建议.
任务的第一部分 - 将文件名转换为'结构'最好使用FileSet - 比如名为scripts的目录中的SQL 脚本:
<fileset dir="scripts" includes="*.sql" id="versions" />
Run Code Online (Sandbox Code Playgroud)
这将创建一个可以使用id引用的Ant 资源集合versions.该集合了解您的SQL脚本文件.
使用(如你所建议的)正则表达式映射器,我们可以将文件集转换为字符串集合,只保留文件名中的版本部分:
<mappedresources id="versions">
<fileset dir="scripts" includes="*.sql" />
<regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,versions现在有一个'list',它将"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>
Run Code Online (Sandbox Code Playgroud)
它定义了一个新的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}." />
Run Code Online (Sandbox Code Playgroud)
当我用你的三个文件运行时,我得到:
[echo] Latest SQL script version: 6.
Run Code Online (Sandbox Code Playgroud)