2

说我需要做类似的事情:

<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>,这很公平。我一直在沿着这些思路思考:

我可以添加一个带有“元素”属性的宏定义,如下所示:

<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 不会抱怨?

4

2 回答 2

1

AntContrib有一个 Ant FileSet对象,增加了ifunless条件

http://ant-contrib.sourceforge.net/fileset.html

if设置“if”条件的属性名称。除非定义了属性,否则将忽略文件集。该属性的值无关紧要,但会暗示误解(“false”、“no”)的值在评估时会引发异常。

除非 设置“除非”条件的属性名称。如果设置了命名属性,则文件集将被忽略。该属性的值是微不足道的,但会暗示对行为的误解(“false”、“no”)的值在评估时会引发异常。

你可以像这样使用它:

<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>
于 2010-10-21T23:50:45.640 回答
1

实现这一目标的一种方法(不确定是否好)是创建两个宏定义 - 一个用于一般用途的“公共”和一个执行实际工作的“内部”,并且只能从“公共”宏中调用。像这样:

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

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

于 2010-10-22T13:38:31.200 回答