2010-01-26 11 views
5

Używam ant 1.6.2 i próbuję skonfigurować zadanie, które porówna katalog źródłowy i docelowy, zidentyfikuje wszystkie podkatalogi istniejące w katalogu źródłowym i usunie podobne podkatalogi w katalogu docelowym.Jak wybrać podkatalogi w ant używając FileSet?

Tak, więc katalog źródłowy ma podkatalogi sub1, sub2 i sub3 w nim, a katalog docelowy ma sub1, sub2, sub3 i sub4 w nim, a następnie chciałbym usunąć sub1, sub2 i sub3 z cel docelowy

Myślałem, że mogę to zrobić, używając FileSelector do identyfikacji wszystkich katalogów źródłowych, które są obecne w celu. Jednak nie mogę uzyskać selektora pliku typu <, aby kiedykolwiek zwrócić dopasowanie do katalogów.

Ostatecznie pomyślałem, że zrobię coś takiego:

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

zacząłem po prostu próbuje listy katalogów znajdujących się w katalogu ze źródłami i wydrukować je:

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

jednak Nigdy nie dostaję niczego wydrukowanego z ustawionym typem na katalog. Jeśli zmienię typ na plik, pliki zostaną wydrukowane.

Czy istnieje lepszy sposób na wykonanie tego, co próbuję wykonać? Czy brakuje mi czegoś w moim używaniu selektora typu?

Odpowiedz

4

Bez pisania niestandardowego zadania Ant, to będzie trochę nieporządne. Poniższe rzeczy powinny wystarczyć, jeśli z przyjemnością korzystasz z biblioteki ant-contrib. To trochę hack (zwłaszcza sposób, w jaki używa właściwości), ale wydaje się, że działa dobrze.

<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

Dzięki za pomoc. Obecnie nie używam biblioteki programu contrib, więc pomyślałem, że najpierw wypróbuję niestandardową trasę, którą zasugerowałeś. To okazało się dość łatwe i dobrze się spisało. Dzięki. –

+0

@EricRosenberg Czy możesz przesłać niestandardowe zadanie jako odpowiedź? To działa dobrze z SO, a byłoby to coś, czego szukamy. –

+0

@OzairKafray Przepraszamy, ale nie mam już dostępu do implementacji niestandardowego zadania. –

Powiązane problemy