根据条件包含ant修改选择器

时间:2012-10-31 15:13:41

标签: if-statement ant ant-contrib fileset

我正在修改我现有的ant脚本以支持差异构建。为此,我在文件集中使用了修改后的选择器来仅查找修改过的文件。但问题是,当我进行完整构建时,我需要根据某些属性或参数绕过修改过滤器。如下所示。无论如何都要这样做。

<project name="test" default="dt" basedir=".">
    <target name="dt1">
        <copy todir="ant_temp2">
            <fileset dir="ant_temp1">
                <if>
                    <equals arg1="${ABC}" arg2="true" />
                    <then>
                        <modified update="true" />
                    </then>
                </if>
                <exclude name="*.txt"/>
            </fileset>
        </copy>
    </target>

    <target name="dt">
        <antcall target="dt1">
            <param name="ABC" value="true" />
        </antcall>
    </target>

    <target name="dt2">
        <antcall target="dt1" />    
    </target>
</project>

如果我使用dt目标调用上述ant脚本,那么我需要在modified任务中考虑excludefileset。如果使用dt2进行调用,则我需要仅考虑exclude任务中的fileset

我无法使用上述脚本,因为fileset不支持嵌套if任务。这就是我寻找替代方法的原因。请提出一些方法来做到这一点。

PS:我不想创建具有相同副本任务的两个目标,其中包括modified中的excludefileset以及仅exclude的另一个目标。

2 个答案:

答案 0 :(得分:0)

您可以使用targets上的ifunless属性使其执行以某个属性为条件。您应该将条件部分移动到其自己的目标(如果尚未完成),然后向目标添加ifunless条件。

我从你的例子中并不完全清楚,但这可能意味着在两个目标中都有copy,其中只有一个modified部分。在这种情况下,您可以使每个目标以相同的属性为条件 - 一个作为if,另一个作为unless

答案 1 :(得分:0)

我使用下面的ant脚本来实现我的要求。

<project name="test" default="dt" basedir=".">
    <patternset  id="fs1">
        <exclude name="*.txt"/>
    </patternset >

    <target name="dt1">
        <copy todir="ant_temp2">
            <fileset dir="ant_temp1">
                <patternset refid="fs1" />
            </fileset>
        </copy>
    </target>

    <target name="dt3">
        <copy todir="ant_temp2">
            <fileset dir="ant_temp1">
                <modified update="true" />
                <patternset refid="fs1" />
            </fileset>
        </copy>
    </target>
</project>

我创建了可重用的模式集,开发人员将更新该模式集中的排除项,我正在重复使用该模式集进行常规和增量构建。