2010-01-26 68 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