1

我正在修改我现有的 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>

如果我使用 target 调用上面的 ant 脚本,那么dt我需要考虑in任务。如果它是使用调用的,那么我只需要在任务中考虑。modifiedexcludefilesetdt2excludefileset

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

PS:我不想创建具有相同复制任务的两个目标,一个包含modifiedexcludein fileset,另一个目标仅包含exclude.

4

2 回答 2

0

您可以在目标if上使用和unless属性,使它们的执行以属性为条件。您应该将条件部分移动到它自己的目标(如果尚未完成),然后将or条件添加到目标。ifunless

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

于 2012-10-31T17:31:17.797 回答
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>

我已经创建了可重用的模式集,开发人员将在该模式集中更新他们的排除项,并且我正在将该模式集重用于正常和增量构建。

于 2012-11-03T05:07:13.337 回答