ANT:加载文件名并从文件名中提取数据

End*_*ndo 4 ant filenames

您好我不太确定如何标题这个问题,但我会解释为什么我要这么做.

首先,我有一个包含特定格式的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的新手,我不确定这是否可行和/或可行.

谢谢你的任何建议.

mar*_*ton 5

任务的第一部分 - 将文件名转换为'结构'最好使用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)