2008-10-22 9 views
29

Tengo una hormiga build.xml que usa la tarea <copy> para copiar una variedad de archivos xml. Utiliza el filtrado para fusionarse en propiedades de un archivo build.properties. Cada entorno (dev, stage, prod) tiene un build.properties diferente que almacena la configuración para ese entorno.filtrado de hormigas: error si la propiedad no está establecida

A veces agregamos nuevas propiedades a Spring XML u otros archivos de configuración que requieren la actualización del archivo build.properties.

Quiero que la hormiga falle rápidamente si faltan propiedades en build.properties. Es decir, si los tokens sin procesar @[email protected] ingresan en los archivos generados, quiero que la creación fallezca para que el usuario sepa que necesita agregar una o más propiedades a sus build.properties locales.

¿Esto es posible con las tareas integradas? No pude encontrar nada en los documentos. Estoy a punto de escribir una tarea de hormiga personalizada, pero tal vez pueda ahorrarme el esfuerzo.

Gracias

Respuesta

19

puede hacerlo en la hormiga 1,7, utilizando una combinación de la LoadFile tarea y la condición match.

<loadfile property="all-build-properties" srcFile="build.properties"/> 
<condition property="missing-properties"> 
    <matches pattern="@[^@]*@" string="${all-build-properties}"/> 
</condition> 
<fail message="Some properties not set!" if="missing-properties"/> 
+0

Nice. De hecho, quería hacer lo contrario (asegurarme de que ciertos archivos clave tenían @, a veces alguien revisa accidentalmente una versión sin los tokens de sustitución) y podía usar este enfoque. –

+0

Muy agradable. Perdón por no haber aceptado esto antes. Parece lo que buscaba. –

+1

Puede anidar la condición dentro del error: lexicalscope

4

que iba a sugerir que intenta utilizar <property file="${filter.file}" prefix="filter"> para cargar en realidad las propiedades en Ant, y luego fail si alguno de ellos no está ajustada, pero creo que interpretaba el problema equivocado (que quería fallar si una propiedad especificada no estaba configurada en el archivo de propiedades).

Creo que su mejor opción es usar <exec> para (dependiendo de su plataforma de desarrollo) hacer una grep para el carácter "@", y luego establecer una propiedad para el número de ocurrencias encontradas. No está seguro de la sintaxis exacta, pero ...

<exec command="grep \"@\" ${build.dir} | wc -l" outputproperty="token.count"/> 
<condition property="token.found"> 
    <not> 
     <equals arg1="${token.count}" arg2="0"/> 
    </not> 
</condition> 
<fail if="token.found" message="Found token @ in files"/> 
0

si el comando exec está en desuso en su versión de la hormiga puede utilizar redirectores, algo así como:

<exec executable="grep"> 
    <arg line="@ ${build.dir}"/> 
    <redirector outputproperty="grep.out"/> 
</exec> 
<exec executable="wc" inputstring="${grep.out}"> 
    <arg line="-l"/> 
    <redirector outputproperty="token.found"/> 
</exec> 

para crear la propiedad token.found

para la conditonal

93

Si está buscando una propiedad específica, que sólo puede utilizar la tarea fallar con el atributo a menos, por ejemplo:

<fail unless="my.property">Computer says no. You forgot to set 'my.property'!</fail>

+4

excelente. Simple y eficaz. – argatxa

+0

Esto es exactamente lo que yo estaba buscando - ¡gracias! –

+0

Me encanta esta solución. Gracias. –

0

Desde Ant 1.6.2 condition también se pueden anidar en el interior fail.

El siguiente macro facilita la verificación condicional de varias propiedades.

<macrodef name="required-property"> 
    <attribute name="name"/> 
    <attribute name="prop" default="@{name}"/> 
    <attribute name="if" default="___"/> 
    <attribute name="unless" default="___"/> 
    <sequential> 
     <fail message="You must set property '@{name}'"> 
      <condition> 
       <and> 
        <not><isset property="@{prop}"/></not> 
        <or> 
         <equals arg1="@{if}" arg2="___"/> 
         <isset property="@{if}"/> 
        </or> 
        <or> 
         <equals arg1="@{unless}" arg2="___"/> 
         <not><isset property="@{unless}"/></not> 
        </or> 
       </and> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

<target name="required-property.test"> 
    <property name="prop" value=""/> 
    <property name="cond" value="set"/> 
    <required-property name="prop"/> 
    <required-property name="prop" if="cond"/> 
    <required-property name="prop" unless="cond"/> 
    <required-property name="prop" if="cond2"/> 
    <required-property name="prop" unless="cond2"/> 
    <required-property name="prop" if="cond" unless="cond"/> 
    <required-property name="prop" if="cond" unless="cond2"/> 
    <required-property name="prop" if="cond2" unless="cond"/> 
    <required-property name="prop" if="cond2" unless="cond2"/> 
    <required-property name="prop2" unless="cond"/> 
    <required-property name="prop2" if="cond2"/> 
    <required-property name="prop2" if="cond2" unless="cond"/> 
    <required-property name="prop2" if="cond" unless="cond"/> 
    <required-property name="prop2" if="cond2" unless="cond2"/> 
    <required-property name="success"/> 
</target> 
Cuestiones relacionadas