Ant (3): conceptos importantes
miércoles, enero 16, 2002 at 1:00AM
Introducción a Ant (III): conceptos importantes
Descripción
En este artículo vamos a hablar de algunos conceptos importantes que serán necesarios a la hora de hablar de las tareas predefinidas en Ant.
El contenido de este artículo está basado en la documentación oficial de Ant v.1.4.
Patrones
Algunas tareas utilizan o manipulan uno o más subárboles de directorios o partes de los mismos. Es necesaria, pues, alguna forma de nombrar un directorio o parte de él (por ejemplo, todos los ficheros .java de un directorio y de sus subdirectorios).
Un patrón es una expresión que permite definir un subconjunto de ficheros. Es posible definir dos tipos de subconjuntos de un árbol de directorios, en función de que se incluyan o excluyan de la selección los ficheros cuyo nombre concuerda con un determinado patrón. Cuando se usan a la vez un patrón para incluir ficheros y otro para excluirlos, el subconjunto resultante estará formado por aquellos ficheros que cumplan el patrón de inclusión y no cumplan el de exclusión.
Los patrones se pueden especificar en los atributos de las tareas que los necesiten, como elementos anidados de las mismas o en ficheros aparte. En este último caso, cada linea del fichero se interpreta como un patrón distinto.
Los dos patrones más sencillos son los habituales * (que concuerda con cero o más caracteres) y ? (que concuerda con exactamente un caracter). Las combinaciones de * y ? están permitidas.
Cuando en el patrón se indican directorios (ej. /dir1/*/dir2) la concordancia se hace por directorios. En primer lugar, se busca un primer directorio. Una vez fijado, su contenido se hace concordar contra el segundo directorio en el patrón, etc.
Para simplificar este tipo de concordancias, y poder hacer concordancias en múltiples niveles de directorios a la vez, se utiliza el patrón **, que concuerda con un subárbol completo de directorios o con cualquier fichero dentro de un subárbol de directorios. El patrón ** concuerda con cero o más directorios. Por ejemplo /dir1/** concuerda con cualquier fichero o directorio por debajo de dir1, independientemente del nivel al que se encuentre. Así, /dir1/f.txt y /dir1/dir2/dir3/f.txt concuerdan con /dir1/**.
Una forma alternativa a ** consiste en terminar una ruta con / o \. En este caso, Ant automáticamente añade ** al final de la misma.
Exclusión de ficheros por defecto
Cuando se utilizan conjuntos de ficheros, por defecto se excluyen los ficheros que concuerdan con alguno de los siguientes patrones:
- **/*~
- **/#*#
- **/.#*
- **/%*%
- **/CVS
- **/CVS/**
- **/.cvsignore
- **/SCCS
- **/SCCS/**
- **/vssver.scc
Conjuntos de patrones
A menudo es útil poder agrupar patrones en un único conjunto. Éste se define una sóla vez y es referenciado posteriormente en distintas tareas del mismo fichero, una o más veces.
Para ello se utiliza el elemento patternset, que puede aparecer dentro de un elemento fileset o en una tarea orientada a directorios.
El elemento patternset puede tener los siguientes atributos:
- includes: lista separada por comas con los ficheros a incluir en este conjunto. Por defecto, se incluyen todos los ficheros.
- includesfile: nombre de un fichero que contiene un patrón de inclusión por linea
- excludes: lista separada por comas con los ficheros a excluir en este conjunto. Por defecto, no se excluye ningún fichero, excepto los exluidos por defecto.
- excludesfile: nombre de un fichero que contiene un patrón de exlusión por linea
Además, es posible incluir en el elemento patternset, elementos include, exclude, includesfile y excludesfile.
Los elementos include y exclude definen un único patrón (los atributos admiten una lista) para incluir o excluir ficheros, respectivamente. Tienen los siguientes atributos:
- name: patrón de inclusión o exclusión
- if: nombre de una propiedad que debe haber sido definida para que se utilice el patrón
- unless: nombre de una propiedad que NO debe haber estado definida para que se utilice el patrón
Ejemplo:
<patternset id="miConjunto">
<include name="dir1/*.java" if="propiedad1">
<exclude name="dir1/ABC*.java" if=propiedad2">
</patternset>
Con el patternset anterior, estamos diciendo:
- El identificador de este conjunto es miConjunto.
- Si propiedad1 tiene valor, se incluyen todos los ficheros *.java del directorio dir1. En caso de que no lo tenga, se incluyen todos los ficheros posibles.
- Si propiedad2 tiene valor, se excluyen todos los ficheros *.java que empiecen por ABC. En caso de que no lo tenga, no se excluye ningún fichero.
Los elementos includesfile y excludesfile se usan igual que los atributos de igual nombre. La diferencia consiste en que mediante elementos, es posible indicar más de un fichero de inclusión o exclusión. Estos dos elementos tienen atributos name, if y unless que se utilizan igual que en los elementos include y exclude.
Conjuntos de ficheros
Un elemento fileset permite indicar un conjunto de ficheros. Los elementos fileset se utilizan en tareas donde sea necesario referise a varios ficheros (ej.: los ficheros fuente en javac).
Para determinar qué ficheros se incluyen en un conjunto de ficheros se pueden utilizar uno o más elementos patternset. También es posible definir el patternset a usar mediante los atributos includes, includesfile, excludes y excludesfile, que tienen el mismo significado que en patternset.
El elemento fileset admite otros dos parámetros más:
- dir: directorio raíz de este fileset
- defaultexcludes: indica si se deben excluir ficheros por defecto (yes) o no (no). Si no se indica este atributo, sí se excluyen ficheros por defecto.
Conjuntos de filtros
Un elemento filterset indica un conjunto de filtros. Un filtro permite reemplazar ocurrencias de una expresión con otra expresión distinta.
El elemento filterset tiene dos atributos, starttoken y endtoken, (por defecto, ambos son @) que permiten indicar el caracter a usar como delimitador de las cadenas a buscar.
Es posible especificar un filtro de dos formas distinas:
- Mediante un elemento filter, que indican un filtro para una única expresión, con sus atributos token y value.
- Mediante un elemento filtersfile, que indica un filtro para muchas expresiones, con su atributo file.
Ejemplos:
<filterset starttoken="(@" endtoken="@)">
<filter token="maquina" value="127.0.0.1"/>
<filtersfile file="filtros.txt"/>
</filterset>
En el ejemplo anterior estamos diciendo:
- Vamos a buscar cadenas delimitadas por (@ y @)
- Cuando encontremos la cadena maquina, la sustituiremos por 127.0.0.1
- En el fichero filtros.txt hay pares adicionales (cadena, reemplazo). Cuando encontremos una cadena de las que hay indicadas en este fichero, la sustituiremos por su pareja correspondiente.
Mapeo entre ficheros origen y destino
A menudo es necesario indicar una relación entre el nombre de un fichero fuente, cuyo nombre se pasa a alguna tarea, y el del fichero destino generado. Para ello se utiliza el elemento mapper.
Internamente, Ant utiliza una interfaz Java (org.apache.tools.ant.util.FileNameMapper) que es implementada por distintas clases. Cada implementación ofrece una funcionalidad u otra.
El elemento mapper tiene los siguientes atributos:
- type: nombre de una implementación predefinida (este atributo es excluyente con el siguiente)
- classname: nombre de la clase de una implementación propia del usuario (este atributo es excluyente con el anterior)
- classpath: classpath a usar para buscar a la clase indicada por el atributo classname
- classpathref: referencia a un elemento classpath existente
- from: atributo from (para el método setFrom) de la implementación indicada
- to: atributo to (para el método setTo) de la implementación indicada
Ant no convierte los caracteres / y \ en los atributos from y to. Puede ser útil utilizar ${file.separator}, que contiene el separador de ficheros utilizado por el sistema operativo subyacente.
El atributo classpath no es imprescindible. En su lugar se puede utilizar un elemento classpath anidado.
Las implementaciones predefinidas que ofrece Ant son identity, flatten, merge, glob y regexp. Para más información acerca de ellas, se recomienda consultar la documentación oficial de Ant.
Atributos comunes a todas las tareas
Todas las tareas predefinidas tienen los siguientes atributos:
- id: identificador único para la instancia actual de la tarea, que puede ser usado para referenciarla
- taskname: nombre de la instancia actual de la tarea, utilizado en la salida generada por Ant
- description: descripción de la tarea, comentarios, etc.
|
j2se 