代码之家  ›  专栏  ›  技术社区  ›  Borek Bernard

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

  •  2
  • Borek Bernard  · 技术社区  · 14 年前

    说我需要做如下的事情:

    <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 元素)。

    如何对附加文件集进行编码 里面 让蚂蚁不抱怨的宏定义?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Borek Bernard    14 年前

    实现这一目标的一种方法(不确定是否是一个好方法)是创建两个macrodef——一个“public”用于一般用途,另一个“internal”用于实际工作,仅从“public”宏调用。这样地:

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

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

        2
  •  1
  •   Mads Hansen    14 年前

    安东尼布 有蚂蚁 FileSet object augmented with if and unless conditions .

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

    如果 设置“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>