Определение задачи-или макроса — в ant-скрипте

#ant

Вопрос:

У нас есть большой build.xml файл , в котором некоторые задачи дословно повторяются в нескольких целях-например, многословный <echo> , который обновляет файл(ы) журнала содержимым объекта:

 <echo file="foo.log" message="${run.name} completed with status ${run.status}. Errors: ${run.errors}, warnings: ${run.warnings}, processed ${run.processed}"/>
 

Можно ли это превратить во что-то вроде <logrun file="file.log" run=${run}"/> в XML? То есть без того, чтобы мы писали Java-код для реализации новой logrun задачи?

Ответ №1:

Короткий ответ-да, используя задачу Ant <macrodef> .

Что-то вроде этого:

 <macrodef name="logrun">
   <attribute name="file"/>
   <attribute name="name"/>
   <attribute name="status"/>
   <attribute name="errors"/>
   <attribute name="warnings"/>
   <attribute name="processed"/>
  <sequential>
    <echo file="@{file}"
          message="@{name} completed with status @{status}. Errors: @{errors}, warnings: @{warnings}, processed @{processed}${line.separator}"/>
  </sequential>
</macrodef>

<logrun file="foo.log" name="foo.name" status="foo.status" errors="foo.errors" warnings="foo.warnings" processed="foo.processed" />
 

Обратите внимание на то, как именованные параметры макроса упоминаются в «теле» макроса с использованием @ префикса. Я добавил ${line.separator} параметр в конце сообщения, чтобы строка, записанная в файл, заканчивалась. Возможно, вы захотите использовать append="true" в задаче echo, чтобы файл не был полностью перезаписан при каждом вызове макроса.

Макрос может обслуживать все ваши граничные случаи атрибутов, в зависимости от того, насколько они сложны.

Комментарии:

1. Я попытался передать только ${run} … и зарегистрировать поля, как @{run.status} … но они никогда не были расширены, я получил буквальные строки, такие как » @{run.status} в журнале. Есть идеи, почему?

2. @ следует использовать только внутри определения макроса, а не при вызове макроса. Чтобы передать значение свойства, обратитесь к нему обычным способом с префиксом доллара: ${run.status}, и так далее.

3. Итак, нельзя передать «объект» — например ${run} -и все его поля будут доступны в макросе? Вместо этого поля должны быть прописаны-в виде строк -по отдельности?

4. Я не думаю, что свойства муравьев являются реальными объектами. вы можете использовать свойства в своем макросе и передать имя свойства в качестве параметра макроса ` <имя макроса=»objrun»> <имя макроса=»objrun»><имя атрибута=»obj»/> <имя атрибута=»obj»/><последовательный> <последовательный> Ошибки: ${@{obj}.ошибки}, предупреждения: ${@{obj}.предупреждения}, обработано ${@{obj}.обработано}${разделитель строк}»/> ></последовательный> </последовательный></макродеф> </макродеф><имя свойства=»first.name» значение=»первый запуск» /> <имя свойства=»first.name» значение=»первый запуск» /><имя свойства=»первый.статус» значение=»первый успех» /> <имя свойства=»первый.статус» значение=»первый успех» /><objrun obj=»первый» /> `