【问题标题】:Ant: how to write optional nested elementsAnt:如何编写可选的嵌套元素
【发布时间】:2010-10-21 11:30:43
【问题描述】:

说我需要做类似的事情:

<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 会抱怨我的任务不支持嵌套的&lt;if&gt;,这很公平。我一直在思考这些问题:

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

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

【问题讨论】:

    标签: ant macrodef


    【解决方案1】:

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

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

    if 设置“if”条件的属性名称。文件集将是 除非该属性是 定义。该物业的价值是 微不足道,但价值会 暗示误解(“错误”, "no") 会抛出异常 评估。

    unless 设置“除非”条件的属性名称。如果命名 属性设置,文件集将是 忽略。该物业的价值是 微不足道,但价值会 暗示误解(“错误”, "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>
    

    【讨论】:

    • 这很好,但选择复制+文件集只是作为示例。在我的例子中,“副本”是“mxmlc”(Flex 应用程序编译器),“文件集”是“include-libraries”。仍然赞成 contrib FileSet 似乎很有用。
    • @Borek - 我采用的另一种方法是调用 XSLT 样式表来构建 costom ANT build.xml,然后从主 build.xml 的目标中调用自定义生成的 build.xml 文件.如果你用更符合你想要做的事情来更新问题,我可以发布一个例子。
    • 我宁愿继续使用“纯 Ant”,这已经够乱了 :) 我已经发布了我当前的解决方案 - 不是最优雅的解决方案,但可以完成任务。
    • 这很酷。它可能最适合您的需求。仅供参考 - &lt;if&gt; 不是“纯 Ant”,它也是一个 ant-contrib 扩展,比声明式 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2022-09-23
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多