Первая часть задачи - преобразование имен файлов в «структуру» лучше всего выполнить с помощью FileSet - скажем, для сценариев SQL в каталоге с именем scripts :
<fileset dir="scripts" includes="*.sql" id="versions" />
Создает коллекцию ресурсов Ant , на которую можно ссылаться с помощью идентификатора versions
.
Коллекция знает о ваших файлах сценариев 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.