#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=»первый» /> `