2010-01-26 10 views
5

Sto usando ant 1.6.2 e sto provando a impostare un'attività che confronterà una fonte e una directory di destinazione, identificherò tutte le sottodirectory che esistono nella directory sorgente e cancellerò le subdirectory con nome preferite nella directory di destinazione.Come seleziono le sottodirectory nella form utilizzando un FileSet?

Quindi, supponiamo che la directory di origine abbia sottocartelle sub1, sub2 e sub3 in esso e la directory di destinazione abbia sub1, sub2, sub3 e sub4 in esso quindi vorrei eliminare sub1, sub2 e sub3 da destinazione dir.

Ho pensato che avrei potuto farlo utilizzando un FileSelector per identificare tutte le directory in source presenti nella destinazione. Tuttavia, non riesco a ottenere il selettore di file> tipo < per restituire sempre una corrispondenza per le directory.

In definitiva, ho pensato di fare qualcosa di simile:

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

ho iniziato da solo cercando di elencare le directory presenti nella directory dei sorgenti e stamparle:

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

Tuttavia, Non ho mai stampato nulla con il selettore di tipi su directory. Se cambio il tipo di file, ottengo i file stampati.

C'è un modo migliore per realizzare ciò che sto cercando di fare? Mi manca qualcosa nel mio uso del selettore di tipi?

risposta

4

Senza scrivere un'attività personalizzata Ant, questo sarà un po 'disordinato. Il seguente dovrebbe fare il trucco se sei felice di utilizzare la libreria ant-contrib. È un po 'un hack (specialmente il modo in cui usa le proprietà) ma sembra funzionare bene.

<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

Grazie per l'aiuto. Al momento non utilizzo la libreria ant contrib, quindi ho pensato di provare la sequenza di attività personalizzata che hai suggerito per prima. Questo finì per essere abbastanza facile e funzionò alla grande. Grazie. –

+0

@EricRosenberg Puoi inserire l'attività personalizzata come risposta? Funziona bene con SO, e sarebbe qualcosa che stiamo cercando. –

+0

@OzairKafray Ci dispiace, ma non ho più accesso all'implementazione delle attività personalizzate. –