Ant:如何编写可选的嵌套元素

时间:2010-10-21 11:30:43

标签: ant macrodef

说我需要做类似的事情:

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

(真正的任务不是复制,我只是用它来说明这一点。)

Ant会抱怨我的任务不支持嵌套的<if>,这是公平的。我一直在思考这些问题:

我可以添加一个带有“element”属性的macrodef,如下所示:

<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元素中的文件集定义。) / p>

如何编写 macrodef中的其他文件集,以便Ant不会抱怨?

2 个答案:

答案 0 :(得分: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>

我不喜欢它,希望有更好的方法。

答案 1 :(得分:1)

AntContrib 有一个Ant FileSet object augmented with if and unless conditions

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>