ANT: загрузка имен файлов и извлечение данных из имен файлов - PullRequest
4 голосов
/ 08 сентября 2011

Здравствуйте, я не совсем уверен, как озаглавить этот вопрос, но я объясню, почему я пытаюсь это сделать.

Прежде всего, у меня есть папка, содержащая сценарии SQL на определенномформат, который является updateXtoY.sql, где X и Y являются целыми числами.Что мне нужно, это знать, какой Y является наибольшим числом.(в основном, чтобы узнать, какой из них является последним скриптом)

Так что, если у меня в папке "scripts /" 3 файла:

update3to5.sql
update2to5.sql
update1to6.sql

, мне нужно назначить свойство'latest.version' значение 6.

С этого момента я легко могу запустить скрипт.Таким образом, у меня проблема в 3 раза:

1- Как загрузить имена файлов в структуру данных.

2- Как перебрать структуру данных.

3- Как оценить каждое имя файла, чтобы я мог извлечь часть файла "Y" и получить наибольшее значение.(Я сейчас читаю на регулярные выражения)

Я новичок в ANT, и я не уверен, возможно ли это и / или возможно.

Спасибо за любые предложения.

1 Ответ

5 голосов
/ 09 сентября 2011

Первая часть задачи - преобразование имен файлов в «структуру» лучше всего выполнить с помощью 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...