2010-01-26 10 views
5

Estoy usando ant 1.6.2 y estoy tratando de configurar una tarea que compare una fuente y un directorio de destino, identifique todos los subdirectorios que existen en el directorio de origen y elimine los subdirectorios con nombre y apellido en el directorio de destino.¿Cómo selecciono los subdirectorios en una hormiga usando un FileSet?

Por lo tanto, supongamos que el directorio de origen tiene los subdirectorios sub1, sub2 y sub3 y el directorio de destino tiene sub1, sub2, sub3 y sub4, y me gustaría eliminar sub1, sub2 y sub3 de Dir dir

Pensé que podría hacer esto utilizando un FileSelector para identificar todos los directorios en el origen que están presentes en el destino. Sin embargo, no puedo hacer que el selector de archivos tipo <> alguna vez devuelva una coincidencia para los directorios.

En última instancia, pensé que había que hacer algo como:

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

Empecé tratando de enumerar los directorios presentes en el directorio de origen e imprimirlos:

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

Sin embargo, Nunca me imprime nada con el selector de tipo establecido en el directorio. Si cambio el tipo a archivo, obtengo archivos impresos.

¿Hay una mejor manera de lograr lo que estoy tratando de hacer? ¿Me estoy perdiendo algo en mi uso del selector de tipo?

Respuesta

4

Sin escribir una tarea Ant personalizada, esto va a ser un poco desordenado. Lo siguiente debería hacer el truco si está contento de usar la biblioteca ant-contrib. Es un truco (especialmente la forma en que usa propiedades) pero parece funcionar bien.

<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

Gracias por la ayuda. En este momento no utilizo la biblioteca Ant Contrib, así que pensé que probaría la ruta de tarea personalizada que sugirieras primero. Eso terminó siendo bastante fácil y funcionó muy bien. Gracias. –

+0

@EricRosenberg ¿Puede por favor publicar la tarea personalizada como su respuesta? Eso funciona bien con SO, y sería algo que estamos buscando. –

+0

@OzairKafray Lo siento, pero ya no tengo acceso a la implementación de tareas personalizadas. –

Cuestiones relacionadas