Ant: как написать дополнительные вложенные элементы - PullRequest
2 голосов
/ 21 октября 2010

Скажите, что мне нужно сделать что-то вроде:

<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 ]

2 голосов
/ 22 октября 2010

Один из способов (не уверенный, если хороший) для достижения этого состоит в создании двух макроопределений - одного «общего» для общего использования и одного «внутреннего», которое выполняет реальную работу и предназначено для вызова только из «открытого» "макрос. Как это:

<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>

Мне это не очень нравится, и я надеюсь, что есть лучший способ.

1 голос
/ 22 октября 2010

AntContrib имеет объект Ant FileSet , дополненный , если и , если только условия .

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>
...