2010-01-26 48 views
5

我正在使用ant 1.6.2,并且正在尝试设置一个任务,该任务将比较源目录和目标目录,确定源目录中存在的所有子目录,并删除目标目录中的已命名子目录。如何使用FileSet在ant中选择子目录?

因此,假设源目录中有子目录sub1,sub2和sub3,目标目录中有sub1,sub2,sub3和sub4,那么我想删除sub1,sub2和sub3目标目录。

我想我可以通过使用FileSelector来标识目标中存在的所有目录中的目录。但是,我无法使< type>文件选择器返回目录匹配。

最后,我想我会做这样的事情:

<fileset id="dirSelector" dir="${install.dir}"> 
    <type type="dir"/> 
    <present targetdir="${dist.dir}"/> 
</fileset> 

我开始只是想列出存在的源目录中的目录,并把它们打印出来:

<fileset id="dirSelector" dir="${install.dir}"> 
    <type type="dir"/> 
</fileset> 
<property name="selected" refid="dirSelector" /> 
<echo>Selected: ${selected}</echo> 

然而,我从来没有得到任何打印的类型选择器设置为目录。如果我将文件类型更改为文件,我会将文件打印出来。

有没有更好的方法来完成我想要做的事情?我在使用类型选择器时错过了什么?

回答

4

不写一个自定义的Ant任务,这会有点混乱。如果您乐意使用ant-contrib库,以下应该做的伎俩。这有点破解(特别是它使用属性的方式),但它似乎工作正常。

<project name="stackoverflow" default="delete_target_dirs"> 

    <taskdef resource="net/sf/antcontrib/antlib.xml"> 
    <classpath> 
     <pathelement location="ant-contrib-1.0b3.jar"/> 
    </classpath> 
    </taskdef> 

    <property name="src.dir" value="src"/> 
    <property name="target.dir" value="target"/> 

    <target name="delete_target_dirs"> 

    <for param="file"> 
     <path> 
     <dirset dir="${src.dir}"> 
      <include name="**"/> 
     </dirset> 
     </path> 

     <sequential> 
     <basename property="@{file}_basename" file="@{file}" /> 
     <available property="@{file}_available" file="${@{file}_basename}" filepath="${target.dir}" /> 
     <if> 
      <equals arg1="${@{file}_available}" arg2="true"/> 
      <then> 
      <delete verbose="true"> 
       <dirset dir="${target.dir}" includes="${@{file}_basename}"/> 
      </delete> 
      </then> 
     </if>     
     </sequential> 
    </for> 

    </target> 

</project> 
+1

感谢您的帮助。我目前不使用ant contrib库,所以我想我会尝试先建议的自定义任务路线。这最终变得相当简单,并且工作得很好。谢谢。 – 2010-01-28 13:24:11

+0

@EricRosenberg您可以将自定义任务发布为答案吗?这对于SO来说工作得很好,而且这将是我们正在寻找的东西。 – 2014-02-25 11:06:02

+0

@OzairKafray对不起,但我无法再访问自定义任务实施。 – 2014-04-23 20:33:58

相关问题