Ant: как написать дополнительные вложенные элементы
Скажи, что мне нужно сделать что-то вроде:
<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
<fileset dir="dir1" />
<fileset dir="dir2" />
<fileset dir="dir3" />
...
<if>
<equals arg1="${SPECIAL_BUILD}" arg2="true"/>
<then>
<fileset dir="dir7" />
<fileset dir="dir8" />
...
</then>
</if>
</copy>
(Настоящая задача - не копирование, я просто использую его для иллюстрации сути).
Муравей будет жаловаться, что моя задача не поддерживает вложенные <if>
что достаточно справедливо Я думал по этому поводу:
Я мог бы добавить macrodef с атрибутом "element" следующим образом:
<macrodef name="myCopy">
<element name="additional-path" />
<sequential>
<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
<fileset dir="dir1" />
<fileset dir="dir2" />
<fileset dir="dir3" />
...
<additional-path/>
</copy>
</sequential>
</macrodef>
Но это будет означать, что вызывающая сторона (цель) должна указать дополнительный путь, которого я хочу избежать (если многие цели вызывают эту задачу, они должны будут повторить определения набора файлов в additional-path
элемент).
Как закодировать дополнительные наборы файлов внутри макроса, чтобы Ant не жаловался?
2 ответа
Один из способов (не уверен, что удачный) это сделать - создать две макроопределения - одну "общедоступную" для общего пользования и одну "внутреннюю", которая выполняет реальную работу и предназначена для вызова только из "публичного" макроса. Как это:
<macrodef name="task-for-public-use">
<sequential>
<if>
<equal arg1="${SPECIAL_BUILD}" arg2="true" />
<then>
<internal-task>
<additional-path>
...
</additional-path>
</internal-task>
</then>
<else>
<internal-task ... />
</else>
</if>
</sequential>
</macrodef>
<macrodef name="internal-task">
<element name="additional-path" />
<sequential>
<copy ...>
...
<additional-path/>
</copy>
</sequential>
</macrodef>
Мне это не очень нравится и надеюсь, что есть лучший способ.
AntContrib имеет объект Ant FileSet, дополненный условиями if и else.
http://ant-contrib.sourceforge.net/fileset.html
if Устанавливает имя свойства для условия if. Набор файлов будет игнорироваться, если свойство не определено. Значение свойства незначительно, но значения, которые подразумевают неверное истолкование ("ложь", "нет"), вызовут исключение при оценке.
Если установить имя свойства для условия "если". Если установлено именованное свойство, набор файлов будет игнорироваться. Значение свойства незначительно, но значения, которые подразумевают неправильное толкование ("ложь", "нет") поведения, вызовут исключение при оценке.
Вы можете использовать это так:
<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
<fileset dir="dir1" />
<fileset dir="dir2" />
<fileset dir="dir3" />
...
<fileset dir="dir7" if="SPECIAL_BUILD" />
<fileset dir="dir8" if="SPECIAL_BUILD" />
</copy>