我正在修改我现有的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
任务中考虑exclude
和fileset
。如果使用dt2
进行调用,则我需要仅考虑exclude
任务中的fileset
。
我无法使用上述脚本,因为fileset
不支持嵌套if
任务。这就是我寻找替代方法的原因。请提出一些方法来做到这一点。
PS:我不想创建具有相同副本任务的两个目标,其中包括modified
中的exclude
和fileset
以及仅exclude
的另一个目标。
答案 0 :(得分:0)
您可以使用targets上的if
和unless
属性使其执行以某个属性为条件。您应该将条件部分移动到其自己的目标(如果尚未完成),然后向目标添加if
或unless
条件。
我从你的例子中并不完全清楚,但这可能意味着在两个目标中都有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>
我创建了可重用的模式集,开发人员将更新该模式集中的排除项,我正在重复使用该模式集进行常规和增量构建。