todos - Cómo excluir un directorio de un conjunto de archivos ant, según el contenido de los directorios
copiar archivos en linux (9)
¿Cómo puedo crear un conjunto de archivos ant que excluya ciertos directorios en función del contenido del directorio?
Utilizo ant para crear un contenedor de distribución que tiene cada localización en directorios separados, algunos de los cuales están incompletos y no deberían publicarse.
Me gustaría agregar algo al directorio (por ejemplo, un archivo llamado incomplete.flag
) para que ant excluya el directorio. Luego puedo eliminar el archivo cuando se complete la traducción e incluirlo en la compilación sin modificar build.xml.
Dada esta estructura de directorios:
proj
+ locale
+ de-DE
+ en-US
+ fr-FR
Este conjunto de archivos excluye todos los archivos incompelte.flag
, pero ¿cómo puedo excluir todos los directorios que los contienen ?
<fileset dir="${basedir}">
<include name="locale/"/>
<exclude name="locale/*/incomplete.flag">
</fileset>
Puedo escribir una tarea ant si es necesario, pero espero que el conjunto de fileset
pueda manejar este caso de uso.
Aquí hay una alternativa, en lugar de agregar un archivo incomplete.flag
a cada directorio que desee excluir, genere un archivo que contenga una lista de todos los directorios que desea excluir y luego use el atributo excludesfile
. Algo como esto:
<fileset dir="${basedir}" excludesfile="FileWithExcludedDirs.properties">
<include name="locale/"/>
<exclude name="locale/*/incomplete.flag">
</fileset>
Espero eso ayude.
Creo que una forma es primero verificar si su archivo existe y si existe para excluir la carpeta de la copia:
<target name="excludeLocales">
<property name="de-DE.file" value="${basedir}/locale/de-DE/incompelte.flag"/>
<available property="de-DE.file.exists" file="${de-DE.file}" />
<copy todir="C:/temp/">
<fileset dir="${basedir}/locale">
<exclude name="de-DE/**" if="${de-DE.file.exists}"/>
<include name="xy/**"/>
</fileset>
</copy>
</target>
Esto debería funcionar también para los otros idiomas.
El siguiente enfoque funciona para mí:
<exclude name="**/dir_name_to_exclude/**" />
En realidad, hay un ejemplo para este tipo de problema en la documentación de Ant. Hace uso de selectores (mencionados anteriormente) y mapeadores. Vea el último ejemplo en http://ant.apache.org/manual/Types/dirset.html :
<dirset id="dirset" dir="${workingdir}">
<present targetdir="${workingdir}">
<mapper type="glob" from="*" to="*/${markerfile}" />
</present>
</dirset>
Selecciona todos los directorios en algún lugar debajo de ${workingdir}
que contienen un ${markerfile}
.
Esto es posible usando el patrón "**" como sigue.
<exclude name="maindir/**/incomplete.flag"/>
la anterior ''exclusión'' excluirá por completo todos los directorios que contengan el archivo incomplete.flag.
Me funciona con un objetivo de jarra:
<jar jarfile="${server.jar}" basedir="${classes.dir}" excludes="**/client/">
<manifest>
<attribute name="Main-Class" value="${mainServer.class}" />
</manifest>
</jar>
este código incluye todos los archivos en "classes.dir" pero excluye el directorio "cliente" del jar.
Necesitas agregar una ''/'' después del nombre del directorio
<exclude name="WEB-INF/" />
Respuesta proporcionada por el usuario mgaert funciona para mí. Creo que debería estar marcado como la respuesta correcta.
Funciona también con selectores complejos como en este ejemplo:
<!--
selects only direct subdirectories of ${targetdir} if they have a
sub-subdirectory named either sub1 or sub2
-->
<dirset dir="${targetdir}" >
<and>
<depth max="0"/>
<or>
<present targetdir="${targetdir}">
<globmapper from="*" to="*/sub1" />
</present>
<present targetdir="${targetdir}">
<globmapper from="*" to="*/sub2" />
</present>
</or>
</and>
</dirset>
Así, teniendo una estructura de directorios como esta:
targetdir
├── bar
│ └── sub3
├── baz
│ └── sub1
├── foo
│ └── sub2
├── phoo
│ ├── sub1
│ └── sub2
└── qux
└── xyzzy
└── sub1
el dirset anterior contendría solo
baz foo phoo (la bar
no coincide debido a xyzzy
mientras que xyzzy
no coincide porque no es un subdirectorio directo de targetdir
)
funciona para mi:
<target name="build2-jar" depends="compile" >
<jar destfile="./myJjar.jar">
<fileset dir="./WebContent/WEB-INF/lib" includes="hibernate*.jar,mysql*.jar" />
<fileset dir="./WebContent/WEB-INF/classes" excludes="**/controlador/*.class,**/form/*.class,**/orm/*.class,**/reporting/*.class,**/org/w3/xmldsig/*.class"/>
</jar>